如何将目录中的所有文件(包括隐藏文件)移动到另一个目录?
例如,如果我有一个文件夹“ Foo”,其中包含文件“ .hidden”和“ notHidden”,如何将这两个文件都移动到名为“ Bar”的目录中?由于“ .hidden”文件保留在“ Foo”中,因此以下内容不起作用。
mv Foo/* Bar/
自己尝试。
mkdir Foo
mkdir Bar
touch Foo/.hidden
touch Foo/notHidden
mv Foo/* Bar/
mv Foo/*(DN) Bar/
或者
setopt -s glob_dots
mv Foo/*(N) Bar/
((N)
如果您知道目录不为空,请忽略。)
shopt -s dotglob nullglob
mv Foo/* Bar/
如果您知道目录不为空:
FIGNORE='.?(.)'
mv Foo/* Bar/
for x in Foo/* Foo/.[!.]* Foo/..?*; do
if [ -e "$x" ]; then mv -- "$x" Bar/; fi
done
如果您愿意让mv
命令即使成功执行也返回错误状态,则要简单得多:
mv Foo/* Foo/.[!.]* Foo/..?* Bar/
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
变量,您可以将其设置为以冒号分隔的通配符模式列表,以将其忽略。如果未设置(默认设置),则外壳程序的行为就像设置了值时为空dotglob
,而如果未设置选项,则其值就为空.*
。请参见手册中的“文件名扩展”。除非目录.
与模式明确匹配..
,否则将始终省略普遍目录和.
。
$ GLOBIGNORE='n*'
$ echo *
..two .one zero
$ echo .*
..two .one
$ unset GLOBIGNORE
$ echo .*
. .. ..two .one
$ GLOBIGNORE=.:..
$ echo .*
..two .one
设置FIGNORE
变量。如果未设置(默认设置),则外壳的行为就像该值是.*
。要忽略.
和..
,必须对其进行显式匹配(ksh 93s + 2008-01-31中的手册指出.
和..
始终被忽略,但这不能正确描述实际行为)。
$ 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:*|.[^.]*|..?*)
。
设置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
变量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句