ファイル名のみを使用して移動

ファイル名のみを使用して移動

あるフォルダから別のフォルダにいくつかのファイルを移動する必要があります。これは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できます。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

関連情報