将所有文件从子目录移动到当前目录?


9

如何将所有子目录中包含的文件移动到当前目录,然后删除空子目录?

我发现 这个问题 ,但要适应答案:

mv * .

不工作;我收到了很多警告:

mv: wil and ./wil are identical

子目录中包含的文件具有唯一的名称。

Answers:


15

你也可以使用 -mindepth 选项:

find . -type f -mindepth 2 -exec mv -i -- {} . \;

(和...一起 -maxdepth 您还可以限制从中收集文件的层次结构级别。)

我用了 mv -i (“互动”) mv 在覆盖文件之前询问。有很多子目录,可能会有你想要警告的名字冲突。

-- 选项停止选项处理,所以 mv 不会被以连字符开头的文件名弄糊涂。

清理整堆空子目录

find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;

是否还有一种方法可以跳过覆盖文件的问题而不是覆盖它们?
Filnor

1
mv的选项: -n, --no-clobber:不要覆盖现有文件。你可能感兴趣 -b, --backup也是。
Florian Jenn

4

试试这个:

find ./*/* -type f -print0 | xargs -0 -J % mv % .

更多信息:单独尝试查找 - 它应该为您提供一个列表,其中包含您要移动的所有文件(请忽略 -print0 )。例:

probe:test trurl$ find ./*/* -type f
./test_s/test_s_s/testf4
./test_s/test_s_s/testf5
./test_s/testf1
./test_s/testf2
./test_s/testf3
./test_s2/testf6
./test_s2/testf7

-print0xargs 您现在正在创建要执行的语句列表。该 -J % flag表示,在这里插入list元素,所以 mv $FILE . 对找到的每个文件执行。

以上是为BSD xargs工作的。如果你正在使用GNU版本(Linux) -I % 代替 -J %


0

Bash 4:

shopt -s globstar
for file in **; do [[ -f "$file" ]] && mv "$file" .; done

-2

1快速技巧,仅在您的文件具有扩展名(带点)时才有效:

mv *.* subdir/
mv .* subdir/

-2

只需运行此命令:-)

mv **/*.* .


1
那将找不到没有的文件 . 在他们的名下,会吗?
G-Man
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.