名前に数字とドット、または@tmpを含むすべてのディレクトリを見つけ、日付でソートし、3番目のステートメントの結果を変数に保存するスクリプトを作成しました。しかし、これは常に私に最初のクエリ結果を与えます。正しい結果を得るにはどうすればよいですか?
TL; DR 一致するディレクトリを日付で並べ替え、そのリストの3番目のディレクトリ名を印刷したいと思います。
OLDDATA=`find . \( -name '*@tmp' -o -regex '.*/[0-9.]+' \) -exec ls -t {} + | awk "NR==3 { print }" `
ls -t 結果の例
./1.2.3.4.5.6.102: ./1.2.3.4.5.6.101: ./1.2.3.4.5.6.100: ./1.2.3.4.5.6.99:
./1.2.3.4.5.6.98: ./1.2.3.4.5.6.97: ./1.2.3.4.5.6.96: ./1.2.3.4.5.6.95:
./1.2.3.4.5.6.94: ./1.2.3.4.5.6.93: ./1.2.3.4.5.6.92: ./1.2.3.4.5.6.91:
./1.2.3.4.5.6.90: ./1.2.3.4.5.6.89: ./1.2.3.4.5.6.88: ./1.2.3.4.5.6.87:
答え1
場合によっては、正しい説明は次のとおりです。
find . \( -name '*@tmp' -o -regex '.*/[0-9.]+' \) -exec ls -t {} \; | awk 'NR==3'
答え2
私はおそらく次のアプローチを選びます(読みやすくするために複数行に分けて1行に接続するだけです)。
ls -td $(
find . -maxdepth 1 -type d \( -name '@tmp' -o -regex '.*/[0-9.]+' \)
) |
sed -n '3{p;q}'
一致するディレクトリ名を見つけて日付順に一覧表示し、そのリストの3番目の項目のみを印刷します。 (この場合、ls
fromを使用して出力をソートすることはfind
許可されています。パス名にスペースやその他の厄介な文字が含まれないようにすることができるためです。通常は誤った仮定です。)
:
コロン()で終わるディレクトリと一致しません(ただし、質問の元のREとも一致しません)。
私はあなたの最初のステートメントがあなたが明示した目標を達成できなかった理由(私が思ったこと)を説明するのが役に立つと思いました。
一度見てみましょうfind
:
find . \( -name '*@tmp' -o -regex '.*/[0-9.]+' \) -exec ls -t {} +
これは、名前が数字..またはドットで終わる@tmp
か、またはこれでのみ設定されたファイルまたはディレクトリと一致します。 2つのパターンのいずれかに一致するファイルまたはディレクトリが見つかった場合は、リストに追加されます。リストに必ずしも一致するすべての項目を含める必要はありません。0
9
.
だと仮定してはいけない。リストが「十分に長い場合」に渡されますls -t
。これは複数回実行できls -t
、各実行は異なるファイル名とディレクトリ名のセットを並べ替えて一覧表示します。
私のシステムでは、ls -t
ファイルは最初にリストされ、変更日に基づいて降順にソートされます。変更された日付の降順でディレクトリ名を並べ替え、各ディレクトリ名の名前を印刷します。そしてその内容(また、日付の降順でソートされます。)使用する必要があるものを省略するにはls -td
。
安全のために、find ... -type d ... -exec ls -dt {} +
表現されたリストにどれだけのディレクトリ名が渡されるかわからないので、それを使用することもできません{}
。
一度見てみましょうawk
:
awk "NR==3 { print }"
{ print; exit}
3番目の項目が印刷されるとすぐに処理を中断する傾向がありますが、大丈夫です。