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]或类似的方法吗?