Find

ls 在目錄中查找具有特定名稱的文件,但 find 沒有

  • January 15, 2022

我正在嘗試查找名稱以 . 開頭的目錄中的所有文件80s

ls 80s*/*找到正確的文件,但find . -ipath '80s*/*'什麼也不返回。此任務的正確find命令是什麼?

我需要使用find,因為我想將所有此類文件移動到不同的文件夾並且不想解析ls.

-ipath匹配完整的路徑名,包括目前路徑.。因此,您必須將其包含在您的模式中:

find . -ipath './80s*/*'

以上也會輸出目錄。要僅列出正常文件,請使用:

find . -ipath './80s*' -type f

(或! -type d除目錄外的任何類型的文件)

如果,如您所說,80s*/*匹配正確的文件,那麼我真的沒有理由使用find

要將所有匹配的名稱移動80s*/*到某個目標目錄destdir,您可以使用

mv -n 80s*/* destdir/

這會將所有非隱藏名稱從任何匹配的目錄移動80s*到單個目錄destdir中。非標準-n選項通常意味著“沒有破壞”,即如果存在名稱衝突,不要覆蓋文件。

如果使用 GNU ,您還可以使用選項(例如)或如上所述的( )mv來避免覆蓋與其他文件同名的文件。--backup``--backup=numbered``-n``--no-clobber

如果您只需要選擇正常文件,或者如果80s*/*擴展的名稱列表太長,請使用循環:

for name in 80s*/*; do
   [ ! -f "$name" ] && continue
   mv -n "$name" destdir/
done

(這也會將符號連結移動到正常文件。為了避免這些,另外測試-h/-L是否"$name"是符號連結。)

zshshell 中,您可以使用移動所有與您的模式匹配的正常文件

mv -n 80s*/*(.) destdir/

…其中 glob 限定符(.)將前面模式的結果過濾為僅包含正常文件((-.)還包括指向正常文件的符號連結)。


如果你真的需要使用find,那麼考慮

find ./80s*/ -path './80s*/*' -prune ! -name '.*' -type f \
   -exec mv -n {} destdir/ \;

這匹配您感興趣的名稱,並避免隱藏名稱(您說80s*/*匹配正確,我認為這意味著不需要隱藏名稱)。它修剪所有匹配的名稱,這意味著它避免輸入與模式匹配的子目錄,然後,如果名稱對應於正常文件,則將文件移動到destdir使用mv -n之前。

使用 GNU mv,您可以通過使用-exec mv -n -t destdir/ {} +代替原來的-exec. 這將mv使用成批找到的文件名執行,而不是mv為每個名稱呼叫一次。

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