Find

僅使用文件名進行移動

  • June 5, 2019

我必須將一些文件從一個文件夾移動到另一個文件夾,標準由查找和 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

$(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 轉發'{}'到子外殼的行為取決於您的find版本。

引用自:https://unix.stackexchange.com/questions/523034