
如何在找到文件的地方執行指令?
假設我有一個名為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 接手。