如何將所有文件(包括隱藏文件)從一個目錄移動到另一個目錄?
如何將目錄中的所有文件(包括隱藏文件)移動到另一個目錄?
例如,如果我有一個文件夾“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
添加
N
glob 限定符以使擴展在空目錄中變為空:*(DN)
.注意:根據您對 、 和 變數的設置,您可能會得到不同順序的文件名擴展結果(例如,
none
後跟)。.one``..two``LC_COLLATE``LC_ALL``LANG