「../in/」と「../temp/」という2つのディレクトリがあります。私の質問は、最も古いファイルまたはディレクトリを同じ../in/ディレクトリに保持し、残りのファイルまたはディレクトリを../temp/ディレクトリに移動するbashスクリプトを書く方法です。
答え1
ファイル名にスペースや改行文字がないと仮定すると、これを行うより簡単な方法があります。現代の世界ではこれを想定することはできません。さらに、脆弱なので、そのような正当なファイル名が見つかった場合、スクリプトが失敗するスクリプトを書くのは悪い形式です。
安全を確保するには、次のコマンドを使用します(GNUツールが必要な場合があります)。
find ../ini/ -type f -printf '%T@ %p\0' | sort -nz | sed -Ezn '2,$s/[^ ]* //p' | xargs --null mv -t ../temp/
../ini/
これにより、最も古いファイルを除くすべてのファイルが../temp/
。
どのように動作しますか?
find ../ini/ -type f
これにより、ディレクトリ内のすべての一般ファイルが検索されます
../ini
。-printf '%T@ %p\0'
これにより、nullで区切られた文字列内のファイルのタイムスタンプと名前が印刷されます。
sort -nz
Null で区切られた文字列を数値でソートします。これが完了すると、最も古いファイルが最初に一覧表示されます。
sed -Ezn '2,$s/[^ ]* //p'
最初のファイルを除くすべてのファイル名が印刷されます。また、タイムスタンプも削除されます。
xargs --null mv -t ../temp/
その後、
mv
そのファイルに対してコマンドが実行され、そのファイルが../temp/
ディレクトリに送信されます。
NULLで区切られた項目をサポートしていないツールを使用してください。
上記の仮想ツールは\0
個々のプロジェクトをサポートしています。最新バージョンのLinux(GNU)はこれをサポートしています。サポートされていないオペレーティングシステムを使用する場合は、いくつかの回避策があります。次の項目は改行で区切られているため、以前のツールと互換性がある必要があります。
find ../ini/ -type f -printf '%T@ %p\n' | sort -n | sed -En '2,$s/[^ ]* //p' | xargs -d'\n' mv -t ../temp/
ファイル名に改行文字が含まれていると、この操作は失敗します。