Bash

移動每個不是目錄的文件

  • September 21, 2020

我有一個要清理的目錄,其中包含文件和子目錄。我想做的很簡單:將所有文件移動到另一個目錄中,但保留所有子目錄不變。

我在想類似的事情:

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

(不將符號連結移動到目錄)。

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