4

ベースフォルダから以下を実行しました。/

find . -name *.xvi.txt | sort

これは、次のソート順を返します。

./LT/filename.2004167.xvi.txt
./LT/filename.2004247.xvi.txt
./pred/2004186/filename.2004186.xvi.txt
./pred/2004202/filename.2004202.xvi.txt
./pred/2004222/filename.2004222.xvi.txt

ご覧のとおり、ファイル名は通常の構造に従いますが、ファイル自体はディレクトリ構造のさまざまな部分にある可能性があります。ソートがファイル名自体のみに基づいてフォルダ/ファイル名のリストを返すように、フォルダ名やディレクトリ構造を無視する方法はありますか?そのようです:

./LT/filename.2004167.xvi.txt
./pred/2004186/filename.2004186.xvi.txt
./pred/2004202/filename.2004202.xvi.txt
./pred/2004222/filename.2004222.xvi.txt
./LT/filename.2004247.xvi.txt

検索コマンドと並べ替えコマンドでいくつかの異なるスイッチを試しましたが、うまくいきませんでした。いつでもすべてを1つのフォルダーにコピーしてそこから並べ替えることができますが、数百のファイルがあり、より洗練されたオプションが存在することを望んでいます。

ありがとう!あなたの助けに感謝します。

4

3 に答える 3

6

find持っている場合-printfは、ベースファイル名とフルファイル名の両方を印刷できます。最初のフィールドで並べ替えてから、それを取り除きます。

find . -name '*.xvi.txt' -printf '%f %p\n' | sort -k1,1 | cut -f 2- -d ' '

区切り文字としてスペースを選択しました。ファイル名にスペースが含まれている場合は、ファイル名に含まれていない文字である別の区切り文字を選択する必要があります。ファイル名に改行が含まれている場合は、機能しないため、これを変更する必要があります。

コマンドのグロブはfind引用符で囲む必要があることに注意してください。

于 2012-07-10T14:10:37.630 に答える
1

findがない場合は、同じことを実行するためにprintf使用できます。awk

find . -name *.xvi.txt | awk -F / '{ print $NF, $0 }' | sort | sed 's/.* //'

デニス・ウィリアムソンが言及したスペースに関する同じ警告がここに当てはまります。そして、多様性のために、私はsedの代わりにソートフィールドを取り除くために使用していますcut

于 2012-07-10T14:18:18.047 に答える
0
find . -name *.xvi.txt | sort -t'.' -k3 -n

必要に応じて並べ替えます。唯一の問題は、ファイル名またはディレクトリ名に追加のドットが含まれるかどうかです。

それを避けるためにあなたは使うことができます:

find . -name *.xvi.txt | sed 's/[0-9]\+.xvi.txt$/\\&/' | sort -t'\' -k2 | sed 's/\\//'
于 2012-07-10T14:24:59.070 に答える