在找到文件的地方執行指令

在找到文件的地方執行指令

如何在找到文件的地方執行指令?
假設我有一個名為testdir包含以下內容的目錄:

$ ls -R testdir/
testdir/:
dir1  dir2  dir3  dir4  dir5

testdir/dir1:
doc1.pdf

testdir/dir2:
file1.txt

testdir/dir3:
doc2.pdf

testdir/dir4:
file2.txt

testdir/dir5:
doc5.pdf

現在我想執行一個操作(執行命令),在其中find找到某個文件/文件類型。例如讓我找出*.pdf

$ find . -name '*.pdf'
./testdir/dir3/doc2.pdf
./testdir/dir5/doc5.pdf
./testdir/dir1/doc1.pdf

現在假設我想執行一個命令(例如touch file),其中上述命令找到文件。換句話說,我想file在至少.pdf找到一個目錄的每個目錄中創建一個名為的文件,以便我可以得到:

$ ls -R testdir/
testdir/:
dir1  dir2  dir3  dir4  dir5

testdir/dir1:
doc1.pdf  file

testdir/dir2:
file1.txt

testdir/dir3:
doc2.pdf  file

testdir/dir4:
file2.txt

testdir/dir5:
doc5.pdf  file

我該如何完成這樣的工作呢?
可能是每次找到檔案時,cd到檔案存在的位置並遞歸執行命令。
我知道它find有很棒的功能:-exec但我無法讓它工作。


這只是一個了解我想做什麼的例子。廣泛地說:如何執行遞歸找到文件(通過)的命令find

答案1

如果您執行此命令,您touch file將從啟動該命令的目錄中執行(可能會多次):

find -name '*.pdf' -exec touch file \;

另一方面,如果運行此變體,則該命令的每個實例都將在目標檔案的目錄中運行:

find -name '*.pdf' -execdir touch file \;

touch file在這兩種情況下,您都可以透過將 替換為echo {}and/or來查看其實際效果pwd


來自線上說明頁:

-execdir command ;
-execdir command {} +

    與 類似-exec,但指定的命令是從包含匹配檔案的子目錄運行的,該子目錄通常不是您啟動的目錄find

答案2

您可以使用 提取檔案名稱的目錄dirname並從那裡獲取它,如下所示:

find . -name "*.pdf" -type f -exec bash myscript {} \;

其中文件myscript包含以下內容:

dir=$(dirname "$1")
cd "$dir"
touch file

答案3

zsh可以使用 glob 限定符來選擇例如僅.pdf檔案和通過修飾語將目錄名稱保存在陣列中獨特的elements,然後cd進入每個目錄並執行命令。這樣你就只運行你的命令一次.pdf在每個目錄中,無論在該目錄中找到的 s數量是多少:

dirlist=(**/*.pdf(.:a:h))
for d in ${(u)dirlist[@]}
  (cd $d && touch file)

或者

typeset -U dirlist
dirlist=(**/*.pdf(.:a:h))
for d in ${dirlist}
  (cd $d && touch file)

您可以進一步組合修飾符和限定符,例如使用副檔名來 glob 常規檔案(隱藏和非隱藏).bkp並將唯一的目錄名稱保存在陣列中:

dirlist=(**/*.bkp(D.:a:h))

答案4

只需輸入即可:

https://bitbucket.org/eradman/entr

你可以做的就是讓 entr 監視指定的目錄。當 find 找到該文件時,請觸碰該目錄中名為「triggerfile.txt」的文件,然後讓 entr 接手。

相關內容