ファイル名のスペースを使用して、ファイルを日付の順序でリストします
質問
数百のファイル(フルパス)のリストをランダムな順序で含むファイルから始めています。そのリストの10の最新ファイルの詳細をリストしたいと思います。これは私の素朴な試みです:
$ ls -las -t `cat list-of-files.txt` | head -10
ファイルがスペースにない限り、それは機能しますが、それらのファイルがスペースで分割され、個別のファイルとして扱われると、それらが行うと失敗します。ファイル「HelloWorld」は私に与えてくれます:
ls: hello: No such file or directory
ls: world: No such file or directory
元のFiles Filesファイルのファイルを引用しようとしましたが、ここでの文書は、ファイル名のスペースにファイルを分割し、引用符をファイル名の一部として扱います。
$ ls -las -t `awk '{print "\"" $0 "\""}' list-of-files.txt` | head -10
ls: "hello: No such file or directory
ls: world": No such file or directory
私がこれを行うことを考えることができる唯一の方法は、各ファイルを個別に(おそらくXargsを使用して)lsし、ファイルリストと日付を並べ替え可能な順序で各ラインの最初のフィールドとして作成し、その中間ファイルをソートすることです。 。ただし、それは少し面倒で非効率的であると感じています(1つまたは2つではなく、数百のLSコマンド)。しかし、それはそれをする唯一の方法かもしれませんか?
「LS」を処理するファイルのリストを「LS」に渡す方法はありますか?これらのファイルにはスペースが含まれている可能性がありますが、簡単に思えますが、私は困惑しています。
解決
「1つ以上の空白文字」の代わりに、Bashに別のフィールドセパレーターを使用するように強制することができます。
OIFS=$IFS
IFS=$'\n'
ls -las -t $(cat list-of-files.txt) | head -10
IFS=$OIFS
ただし、このコードはループを実行するよりも効率的ではないと思います。さらに、List-Files.txtのファイルの数が最大数の引数数を超えている場合、それは機能しません。
他のヒント
これを試して:
xargs -a list-of-files.txt ls -last | head -n 10
これが機能するかどうかはわかりませんが、スペースを逃れようとしましたか \
? SEDか何かを使用します。 sed "s/ /\\\\ /g" list-of-files.txt
, 、 例えば。
これは私のために働いた:
xargs -d\\n ls -last < list-of-files.txt | head -10