合并子文件夹,Linux

3
我有一个名为“Abc”的主文件夹,其中包含约800个子文件夹。每个子文件夹都包含许多文件(格式完全相同,例如“.doc”)。如何创建一个主文件夹,其中包含所有这些文件(而不是分布在子文件夹中)。我正在使用cygwin终端在Windows 7机器上执行此操作。
使用cp -r命令可以复制文件,但会使文件保留在子文件夹中,因此没有什么帮助。我需要协助解决此问题。谢谢!
2个回答

7

假设存在名称冲突和多个扩展名,这将创建唯一的名称,将目录路径更改为破折号(例如a/b/c.doc将变为a-b-c.doc)。从要折叠的文件夹内运行此命令:

# if globstar is not enabled, you'll need it.
shopt -s globstar
for file in */**; do [ -f "$file" ] && mv -i "$file" "${file//\//-}"; done
# get rid of the now-empty subdirectories.
find . -type d -empty -delete

如果您能保证文件名唯一,这将移动文件并删除子目录。您可以将两个.更改为文件夹的名称,并在该文件夹之外运行它:

find . -depth \( -type f -exec mv -i {} . \; \) -o \( -type d -empty -delete \)

0

这可能不是最优雅或高效的方法,但我相信它能实现你想要的:

for file in `find abc`
do
  if [ -f $file ]
  then
    mv $file `basename $file`
  fi
done

遍历abc中的所有内容,检查它是否为文件(而不是目录),如果是,则将其从当前位置移动(例如abc/d/example.txt)到abc/。

编辑:这将保留所有子文件夹(但现在它们将为空)。


其实,如果任何文件名中有空格,那么这种方法是不可行的,因为for循环会将这些文件名分开,导致它不能正常工作。但我认为以下方式可以: find abc -type f | xargs -I {} mv {} flat 这将把所有文件移动到名为flat的目录中。 - user1033563

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接