遍历文件系统并移动文件

遍历文件系统并移动文件

我需要编写一个脚本,进入目录列表,然后将 cretin 文件类型的文件移动到另一个目录中。

使用下面的代码,我可以遍历目录中的所有文件夹并打印它们的名称。我想我需要进入和退出这些文件夹。

for d in */
do
  echo "$d"
done

下面的代码将遍历每个 .png 文件并将其移动到所需的目录。

for file in *.png
 do
    mv "$file" /desired/directory
done

现在由于某种原因,当我将第二段代码块放入第一段代码块时,我得到了以下输出:

mv: cannot stat ‘*.png’: No such file or directory

我如何让它遍历并移动每个文件?我想将此脚本放在 /search/directory/ 的根目录下

答案1

for d in */
do
 mv - n *.png /desired/directory/
done

存在一个问题,即第一个文件将被写入,而后面的文件不会被写入,因为设置了 -n 标签,否则第二个文件将覆盖第一个文件并丢失第一个文件。这不会复制子目录中的任何文件

划掉使用

find /search/directory/ -inane "*.png" -exce mv -n {} /desired/directory/ \;

但对于同名文件会出现同样的问题

如果您想要复制命名文件,例如 Pic.png 1Pic.png 2Pic.png 等

dup=1
find /search/directory/ -inane "*.png" -exce mv -n {} /desired/directory/ \;
while(find /search/directory/ -inane "*.png" | wc -l !=0)
  find /search/directory/ -inane "*.png" -exce mv -n {} /desired/directory/$dup$(basename {}) \;
    dup++
done

如果 /desired/directory 位于 /search/directory 中,则不会跳出此循环。我凭直觉做了这件事,唯一担心的是 while 条件可能需要在括号中使用 find | wc,可能前面还有 $。可以通过错误检查进一步改进,并使用 .png /search/directory /desired/directory 作为参数

答案2

这应该可以做到:

#!/bin/bash
for dir in /full/path/to/recup_Dir.{1..976}; do
mv "$dir"/*.png /full/path/to/desired/directory/
done

这里我们循环遍历源目录,然后将.png这些目录中的所有文件复制到所需目录。由于我们在这里使用绝对路径,因此您可以从任何位置运行此脚本。

相关内容