移動にはファイル名のみを使用する

移動にはファイル名のみを使用する

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 に固有のものであり、コマンドが作成するサブシェルにエクスポートされないため、ファイル名に展開されません。

これをテストするには、

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 '{}' \;

'{}'私の知る限り、サブシェルへの転送の動作はfind-version によって異なります。

答え2

ディレクトリ以下の元の構造を保持したい場合は、の代わりに/somefolder/somedirを使用できます。rsyncmv

テスト設定:

/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

関連情報