如何将文件从许多子目录移动到我的根目录中?

如何将文件从许多子目录移动到我的根目录中?

我在 Mac 10.9.5 上使用 bash。我的 PDF 文件位于许多目录中,所有目录都位于根目录的同一级别...

Dir_1/abc.PDF
Dir_2/def.PDF
Dir_3/ghi.PDF
Dir_3/jkl.PDF
...

我如何编写一个 shell 命令来将所有这些文件移动到“根”目录中,即使文件与子目录一起排列...

abc.PDF
def.PDF
ghi.PDF
Dir_1
Dir_2
Dir_3

答案1

不如这样:

mv ./*/*.pdf .

我已经在我的计算机(zsh 5.0.7 (x86_64-pc-linux-gnu))上做了测试并且运行良好:

> ls -r *    

sub3:
r.2  r.1

sub2:
s.2  s.1

sub1:
t.2  t.1

> mv ./*/*.pdf .
> ls
r.1  r.2  s.1  s.2  sub1  sub2  sub3  t.1  t.2


> tree                                                            
.
├── r.1
├── r.2
├── s.1
├── s.2
├── sub1
├── sub2
├── sub3
├── t.1
└── t.2

答案2

你可以使用find这个:

find * -name "*.pdf" -maxdepth 1 -type f -exec mv {} ../ \;
  • -name "*.pdf"表示要匹配的模式
  • -maxdepth 1意味着它只会深入一层
  • -type f意味着忽略所有非文件的内容(包括符号链接、目录等)
  • -exec mv {} ../ \;是针对找到的每个文件执行的命令 - 具体来说,这意味着命令是mv <FILENAME> ../

答案3

mv */*.PDF .

这将扩展为所有子目录中所有级别深度的具有扩展名的文件的列表.PDF,并将它们移动到当前目录。

如果文件太多,可能会出现错误,这时会出现问题argument list too long。在这种情况下,这将起作用,假设目录或文件名中没有空格、分号、引号等特殊字符:

echo */*.PDF | xargs -i{} mv {} .

xargs是为此类情况而设计的:它以字符串作为输入,收集一次执行所需的字符串,然后使用收集到的列表运行给定的命令。这里我们告诉用列表xargs替换。{}

答案4

我在 Windows 上使用“Directory Opus”{https://www.gpsoft.com.au/dscripts/download.asp} 而不是 Explorer 来启用搜索和成像。在根目录中搜索。这将显示根目录中的所有文件。“Ctrl A”突出显示“全部”,然后按 Ctrl shift 从此列表中删除目录。“Ctrl C”此列表现在仅包含位于根目录中的文件。“Esc”返回根目录。返回根目录并按“Ctrl V”将文件直接粘贴在根目录中。此系统的缺陷是文件在 2 个位置重复。

相关内容