web-dev-qa-db-ja.com

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

最新のファイルをあるディレクトリから別のディレクトリに移動しようとしています。 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
4
user67186

あなたの問題は、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に変換されます。

1
slm

Xargsで-0オプションを回避するか、-print0を使用してください。 xargsのmanページからの抜粋

このような状況では、このような問題を防ぐ-0オプションを使用することをお勧めします。このオプションを使用する場合、確認する必要があります xargsの入力を生成するプログラムヌル文字も使用します区切り文字として使用します。そのプログラムがGNU findなど)の場合、-printオプションがこれを行います。

1
beginer

ファイル名に改行や印刷できない文字が含まれていないことが確実な場合、これはが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=Clsの実行により、非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