我在 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 个位置重复。