Bash
移動每個不是目錄的文件
我有一個要清理的目錄,其中包含文件和子目錄。我想做的很簡單:將所有文件移動到另一個目錄中,但保留所有子目錄不變。
我在想類似的事情:
mv [*_but_no_dirs] ./other_directory
似乎應該有一種簡單的方法來使用萬用字元
*
和正則表達式來做到這一點……有人有想法嗎?
這裡不涉及正則表達式。bash 中的萬用字元(與大多數其他 shell 一樣)僅根據文件名匹配文件,而不是基於文件類型或其他特徵。有一種按類型匹配的方法:
/
在模式末尾添加使其僅匹配目錄或目錄的符號連結。這樣,您可以移動目錄,然後移動剩下的內容,然後將目錄移回——雖然很麻煩,但它確實有效。tmp=$(TMPDIR=.. mktemp -d) mv -- */ "$tmp" mv -- * other_directory/ mv "$tmp"/* . rmdir "$tmp"
(如果目前目錄是文件系統的掛載點,則應避免這種方法,因為這意味著將目錄移開和移回必須將其中的所有數據複製兩次)。
按類型匹配文件的標準方法是呼叫
find
.find . -name . -o -type d -prune -o -exec sh -c 'mv "$@" "$0"' other_directory/ {} +
(也移動符號連結,無論它們是否指向目錄)。
在 zsh 中,您可以使用glob 限定符按類型匹配文件。
.
限定符匹配正常文件;用於^/
匹配所有非目錄,或-^/
排除指向目錄的符號連結。mv -- *(.) other_directory/
在任何 shell 中,您都可以簡單地循環。
for x in *; do if ! [ -d "$x" ]; then mv -- "$x" other_directory/ fi done
(不將符號連結移動到目錄)。