ls 在目錄中查找具有特定名稱的文件,但 find 沒有
我正在嘗試查找名稱以 . 開頭的目錄中的所有文件
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"
是符號連結。)在
zsh
shell 中,您可以使用移動所有與您的模式匹配的正常文件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
為每個名稱呼叫一次。