Answers:
您正在寻找的命令是
mv * .[^.]* ..
或(有关更多信息,请参见下文):
(shopt -s dotglob; mv -- * ..)
说明:该mv
命令移动文件和目录。最后一个参数mv
是目标(在本例中,目录在树中“向上”一步..
)。之前的参数是源文件和目录。星号(*
)是通配符,它匹配所有不以点开头的文件。以点开头的文件(点文件)被“隐藏”。它们使用模式进行匹配.[^.]*
(请参见下面的编辑)。
有关的更多信息,请参见我链接的手册页mv
。
.[^.]*
代替.*
?正如克里斯·约翰森(Chris Johnsen)正确指出的那样:该模式.*
也与.
和相匹配..
。由于您不希望(也无法)移动它们,因此最好使用一种模式,该模式匹配以点号开头的文件名(除了那两个以外)。该模式.[^.]*
就是这样做的:它匹配任何以点(2)开头的文件名(1),然后是不是点(3)的字符,然后是零个或多个任意字符。
正如Paggas 指出的那样,我们还必须添加模式.??*
以匹配以两个点开头的文件。有关使用的其他解决方案,请参见他的答案find
。
提到Arjan的答案shopt
是为了避免点文件的所有这些问题。但是,以破折号开头的文件仍然存在问题。它需要三个命令。不过,我还是喜欢这个主意。我建议像这样使用它:
(shopt -s dotglob; mv -- * ..)
它shopt
在子shell中执行(因此不需要第二次调用shopt
),并使用,--
因此以破折号开头的文件不会被解释为的参数mv
。
.*
可能会导致mv产生有关无法移动.
和的警告/错误..
。您可以试试看mv * .[^.]* ..
。
简短答案:使用
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
长答案:
命令
mv * .* ..
无法.*
匹配.
,因为可以匹配和..
。但是命令
mv * .[^.]* ..
也将不起作用,因为.[^.]*
将不匹配,例如..filename
!相反,我要做的是
mv * .[^.] .??* ..
将匹配除.
和以外的所有内容..
。*
将匹配所有不以a开头的文件.
,.[^.]
将匹配以点号开头的所有2个字符的文件名(不包括)..
,并且.??*
将匹配以点号开头的至少3个字符的所有文件名。
更好的是,您可以使用
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
避免了丑陋的glob入侵mv * .[^.] .??* ..
!
..?*
发表评论,您已经处理了。
mv
您停止寻找任何其他命令选项。大括号是结果文件名。加号表示不要将每个结果(即每个文件名)运行exec,而是将尽可能多的结果放在单个exec中。为了完整-t..
起见,告诉移动目标位置将所有这些文件移动到。
mv在使用时缺少移动隐藏文件的功能*
-那么为什么不使用copy呢?
cp -rf . ..
rm -rf *
无需进入复杂的点滴解决方案并使用find命令。
rsync -a --remove-source-files . ..
rsync
是一种功能非常强大的文件复制工具,通常用于执行有效的增量远程备份和镜像。
使用以上命令,我们告诉rsync
将内容复制.
到..
该开关-a
启用递归到.
子目录并启用其他一些常用选项。
开关--remove-source-files
告诉rsync成功复制后删除源文件,即,它使rsync的行为类似于mv
命令。
--remove-source-files
这不会删除(同步)目录。
-bash: /bin/mv: Argument list too long
错误。这一作品的魅力。
mv * .??* ../.
*
获取所有非点文件。.??*
得到全部。文件长度至少为三个字节,适用于所有合法字节。您可能想要留下的任何东西,rm
而不是mv
无论如何。
这样../.
做并没有任何直接的好处,..
但是当移至目录时,这是一个很好的习惯,因为如果路径有问题,它将按照您的意愿失败。例如mv xyz bletch
,当你认为 bletch
是一个目录,可以由具有更确定的mv xyz bletch/.
。
.[^.]
以获取封面文件,例如.a
。
这个最小化的命令适用于大多数现代shell:
\mv -- {,.{[^.],??}}* ..
否则提到的是一种便携式解决方案:
\mv -- * .[^.] .??* ..
特征:
\防止别名意外更改mv。
-防止将包含前导连字符(-xyz)的文件名解释为命令行参数。
。[^。]匹配以。开头的所有两个字符文件名。除了 ..
。?? *与所有其他文件名匹配三个或更多个字符。
天真的实现:
以下内容将跳过隐藏的UNIX文件名(以开头的文件名)。(.bashrc)。
mv * ..
以下匹配项..递归地尝试将每个目录最终一直移动到当前工作目录($ PWD或pwd)的..中。 永远不要使用。
mv .* ..
我认为将所有文件移至其父目录的最简单解决方案。将会
mv "`ls`" ../
或者,如果存在隐藏的文件/目录
采用:
mv "`ls -a`" ../ 2>/dev/null
另外,假设您要将某个文件夹的内容移动到其内部文件夹之一tony(例如)
采用:
mv "`ls -a`" /tony 2>/dev/null
注意:
"`ls -a`"
移动其中有空格的文件。
2>/dev/null
用于抑制警告/错误,因为ls -a
也会打印.
和..
文件夹,并且您无法移动或复制它们。因此,对于那些文件夹,它将显示错误(如果我们不使用2> / dev / null),则无法移动它们,其余的将非常舒适地移动。
ls -a
如果没有隐藏文件,最好避免使用ls
。
mv $(ls -a)
?点击当前目录及其下的目录,因为ls -a
也会输出..
。
mv ls -a ../
也可以根据需要工作,是的,它将显示我上面提到的那些错误,但除此之外,它会将所需的文件夹/文件移动到父目录。
ls
命令加双引号以移动带有空格的文件。我已经进行了必要的更改。感谢您指出。
[linux] [mv] [cwd] [files]
或类似的方法吗?