最新のファイルをあるディレクトリから別のディレクトリに移動しようとしています。 find
コマンドはファイルを検索しますが、別のディレクトリに移動しません。宛先ディレクトリが存在します。
$ cd /app/path1/path2 && \
find . -type f -printf "%C@ %p\n" | sort | tail -n 2 | \
cut -d " " -f 2- |xargs -0 mv -t /app/path1/path2/path3
error: mv: cannot stat No such file or directory
あなたの問題は、find
によって生成された出力のフォーマットを制御し、改行\n
で分割したという事実によるものです。 -0
を使用するときにxargs
が出力を処理できるようにするには、出力をnull文字\0
で区切る必要があります。ただし、これを修正する簡単な方法は次のとおりです。
$ find . -type f -printf "%C@ %p\n" | sort | tail -n 2 | \
cut -d " " -f 2- | tr '\n' '\0' | xargs -0 mv -t /app/path1/path2/path3
`tr '\ n' '\ 0'コマンドの導入により、新しい行がnullに変換されます。
Xargsで-0オプションを回避するか、-print0を使用してください。 xargsのmanページからの抜粋
このような状況では、このような問題を防ぐ-0オプションを使用することをお勧めします。このオプションを使用する場合、確認する必要があります xargsの入力を生成するプログラムヌル文字も使用します区切り文字として使用します。そのプログラムがGNU findなど)の場合、-printオプションがこれを行います。
ファイル名に改行や印刷できない文字が含まれていないことが確実な場合、これはがls
の出力を解析する意味があるまれなケースの1つです。
cd /app/path1/path2
latest_file=$(LC_ALL=C ls -cr | head -n 1)
mv "$latest_file" /app/path1/path2/path3
または、メインシェルプロセスでのディレクトリ変更を回避したい場合:
latest_file=$(LC_ALL=C ls /app/path1/path2 -cr | head -n 1)
mv "/app/path1/path2/$latest_file" /app/path1/path2/path3
設定LC_ALL=C
ls
の実行により、非ASCII文字が多くのシステム(すべてのシステムではない)で文字通り印刷されることが保証されます。制御文字(印刷可能ではない)は、多くのシステムで依然として破損しています。
一度に複数のファイルを移動できます。ほとんどのファイル名に引き続き対処するには、グロビングをオフにして、改行でのみ分割するようにIFS
を設定します。
set -f; IFS='
'
mv $(ls -cr /app/path1/path2/* | head -n 2) /app/path1/path2/path3
Zshをシェルとして使用できる場合は、 glob qualifier を使用してファイルを並べ替えて選択できるため、これははるかに簡単です。
mv /app/path1/path2/*(oc[1,2]) /app/path1/path2/path3