僅使用檔案名稱進行移動

僅使用檔案名稱進行移動

我必須將一些文件從一個資料夾移動到另一個資料夾,這是由 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 {})將會失敗(更好:只是一個空字串)。此處呼叫的子 shell 不會擴展{}為檔案名,因為這是特定於查找的,不會匯出到您的命令建立的子 shell 中。

您可以透過運行來測試這一點

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 轉送到子 shell 的行為'{}'取決於您的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

相關內容