あるディレクトリから別のディレクトリに最新のファイルを移動しようとしています。この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
答え1
あなたの問題は、生成された出力の形式を制御したために発生します。find
これで改行文字に分割されます\n
。xargs
出力を使用するときに出力を処理するには、-0
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
新しい行を再び null 値に変換する `tr '\n' '\0' コマンドが導入されました。
答え2
xargsに-0オプションを使用しないか、-print0を使用します。 xargs のマニュアルページの一部
このような場合は、これらの問題を回避するために-0オプションを使用することをお勧めします。このオプションを使用すると、保証する必要があるxargsへの入力を生成するプログラムヌル文字も使用してください。区切り記号で。たとえば、プログラムがGNU findの場合、-0を印刷してください。オプションはこれを行います。
答え3
ファイル名に改行や印刷できない文字が含まれていないと確信している場合、解析が行われるまれなケースですls
。
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をシェルとして使用できる場合は、次のものを使用できるため、はるかに簡単になります。グローバル予選。
mv /app/path1/path2/*(oc[1,2]) /app/path1/path2/path3