Shell

如何將所有文件(包括隱藏文件)從一個目錄移動到另一個目錄?

  • February 18, 2022

如何將目錄中的所有文件(包括隱藏文件)移動到另一個目錄?

例如,如果我有一個文件夾“Foo”,其中包含文件“.hidden”和“notHidden”,如何將這兩個文件移動到名為“Bar”的目錄中?以下不起作用,因為“.hidden”文件保留在“Foo”中。

mv Foo/* Bar/

自己試試。

mkdir Foo
mkdir Bar
touch Foo/.hidden
touch Foo/notHidden
mv Foo/* Bar/

Zsh

mv Foo/*(DN) Bar/

要麼

setopt -s glob_dots
mv Foo/*(N) Bar/

(N)如果您知道目錄不為空,請忽略。)

重擊

shopt -s dotglob
mv Foo/* Bar/

Ksh93

如果您知道目錄不為空:

FIGNORE='.?(.)'
mv Foo/* Bar/

標準 (POSIX) sh

for x in Foo/* Foo/.[!.]* Foo/..?*; do
 if [ -e "$x" ]; then mv -- "$x" Bar/; fi
done

如果您願意讓mv命令即使成功也返回錯誤狀態,它會簡單得多:

mv Foo/* Foo/.[!.]* Foo/..?* Bar/

GNU find 和 GNU mv

find Foo/ -mindepth 1 -maxdepth 1 -exec mv -t Bar/ -- {} +

標準查找

如果您不介意更改到源目錄:

cd Foo/ &&
find . -name . -o -exec sh -c 'mv -- "$@" "$0"' ../Bar/ {} + -type d -prune

這裡有更多關於控制點文件是否在 bash、ksh93 和 zsh 中匹配的細節。

重擊

設置dotglob選項

$ echo *
none zero
$ shopt -s dotglob
$ echo *
..two .one none zero

還有更靈活的GLOBIGNORE變數,您可以將其設置為以冒號分隔的萬用字元模式列表以忽略。如果未設置(預設設置),shell 的行為就像如果設置了該值是空dotglob的,並且.*如果該選項未設置則該值是空的。請參閱手冊中的文件名擴展。普遍目錄...總是被省略,除非.模式明確匹配。

$ GLOBIGNORE='n*'
$ echo *
..two .one zero
$ echo .*
..two .one
$ unset GLOBIGNORE
$ echo .*
. .. ..two .one
$ GLOBIGNORE=.:..
$ echo .*
..two .one

Ksh93

設置FIGNORE變數。如果未設置(預設設置),shell 的行為就像值是.*. 要忽略.and ..,它們必須顯式匹配(ksh 93s+ 2008-01-31 中的手冊指出.and..總是被忽略,但這並沒有正確描述實際行為)。

$ echo *
none zero
$ FIGNORE='@(.|..)'
$ echo *
..two .one none zero
$ FIGNORE='n*'
$ echo *
. .. ..two .one zero

您可以通過顯式匹配在模式中包含點文件。

$ unset FIGNORE
$ echo @(*|.[^.]*|..?*)
..two .one none zero

如果目錄為空,要使擴展為空,請使用N模式匹配選項:~(N)@(*|.[^.]*|..?*)~(N:*|.[^.]*|..?*).

Zsh

設置dot_glob選項

% echo *
none zero
% setopt dot_glob
% echo *
..two .one none zero

.並且..永遠不會匹配,即使模式.明確匹配前導。

% echo .*
..two .one

D 您可以使用glob 限定符以特定模式包含點文件。

% echo *(D)
..two .one none zero

添加Nglob 限定符以使擴展在空目錄中變為空:*(DN).


注意:根據您對 、 和 變數的設置,您可能會得到不同順序的文件名擴展結果(例如,none後跟)。.one``..two``LC_COLLATE``LC_ALL``LANG

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