あるディレクトリから別のディレクトリに最新のファイルを移動する

あるディレクトリから別のディレクトリに最新のファイルを移動する

あるディレクトリから別のディレクトリに最新のファイルを移動しようとしています。この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これで改行文字に分割されます\nxargs出力を使用するときに出力を処理するには、-0NULL文字で区切る必要があります\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=Cls非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

関連情報