あるフォルダから別のフォルダにいくつかのファイルを移動する必要があります。これはfindとgrepによって設定された基準です。ファイルを移動しようとすると、ファイルが破損します。
それが試みる実際の動きは次のとおりです。mv /somefolder/export//somefolder/storage/testfileOLD.txt
私が期待していたのはmv /somefolder/storage/testfileOLD.txt /somefolder/export/testfileOLD.txt
私が使用するコマンドは次のとおりです。
find /somefolder/storage/ -type f -name "*OLD*" -newermt '2019-05-1' ! -newermt '2019-06-7' -exec grep -qiF 'closed' {} \; -exec mv {} /somefolder/export/{} \;
私はこれを試してみましたが、-exec basename {}
これは私に正しい結果を与えますが、mvを次のように修正した場合
-exec echo {} /somefolder/export/$(basename {}) \;
動作していることを確認しましたが、まだ/somefolder/export//somefolder/storage/testfileOLD.txt
。
答え1
$(basename {})
失敗します(より良い:空の文字列だけが必要です)。ここで呼び出されたサブシェルはファイル名には拡張されません{}
。これは照会専用であり、コマンドによって生成されたサブシェルにエクスポートされないためです。
以下を実行してテストできます。
find -exec echo "this will be empty:" $(basename '{}') \;
小さなスクリプトを書くことをお勧めします。
#!/bin/bash
mv "$1" /somefolder/export/"$( basename ${1})"
コマンドで実行してくださいfind
。
find /dir/ <specs> -exec grep -qiF 'closed' '{}' \; -exec bash script.sh '{}' \;
AFAIKサブシェルに渡す動作はバージョン'{}'
によって異なりますfind
。
答え2
ディレクトリの元の構造を維持するには、を使用/somefolder/somedir
できます。rsync
mv
テスト設定:
/somefolder/storage/testfileOLD.txt
/somefolder/storage/subdir/fileOLD.txt
取締役後の予想結果:
/somefolder/export/testfileOLD.txt
/somefolder/export/subdir/fileOLD.txt
注文する:
# first, create a file list of relative paths (some arguments removed for simplicity)
$ find /somefolder/storage -type f -name "*OLD*" -printf '%P\n' > /tmp/filelist
# cat to illustrate its content
$ cat /tmp/filelist
subdir/fileOLD.txt
testfileOLD.txt
# then rsync using `--remove-source-files` to move the files
$ rsync -av --remove-source-files --files-from=/tmp/filelist /somefolder/storage /somefolder/export