コマンドラインからいくつかのファイルを引数として受け入れるプログラムがあります。逆の順序でリストされたディレクトリ内のすべてのファイルを使用して呼び出したいと思います。
たとえば、
私は逆の順序でディレクトリに次のファイルを持っています
$ ls -tr
Introduction.pdf 'Object-Oriented Data Model.pdf'
プログラムを直接実行でき、
myprogram Introduction.pdf 'Object-Oriented Data Model.pdf'
しかし、別のコマンドでファイルを一覧表示したいと思います。ファイル名の1つにスペースが含まれているため、機能しません。
myprogram $(ls -tr)
ls
出力を解析することは良い習慣ではないことを覚えておいてください。私が助けることができるかどうかわかりませんfind
。
だから私は何ができますか?
ありがとうございます。
ベストアンサー1
最新バージョンのGNUユーティリティがある場合は、NULLで終わるデータを処理することができます。これにより、データ自体の空白や改行の影響を受けないパイプラインを構築できます。
私のテストツールは次のようなクイックスクリプトです/tmp/args
。
#!/bin/bash
echo "This is args with $# value(s)"
for f in "$@"; do echo "> $f <"; done
コマンドラインで、次のようにファイルが最後に変更された時刻に基づいてソートされたファイル名の範囲を指定できます。
find -type f -printf "%T@ %p\0" | sort -zn | sed -z 's/^[0-9.]* //' | xargs -0 /tmp/args
このfind
コマンドは、各ファイル/パス名の前に最後に変更された日付/時刻の小数秒の表示を追加します。これはsort
、最も低いもの(古いもの)から最も高いもの(最新)まで処理されます。sed
結果のファイル名のセットを並べ替えて渡すために使用した先行番号を削除しますxargs
。ファイル名から先行番号を省略する%p
には、に置き換えます。%P
./
サンプルデータ
# "c d" contains a space; "e f" contains a newline; "h" has leading whitespace
touch a 'e
f' g ' h ' 'c d' b
結果の例
This is args with 6 value(s)
> ./a <
> ./e
f <
> ./g <
> ./ h <
> ./c d <
> ./b <