将子目录中的所有文件移动到工作目录中,并添加路径作为前缀

时间:2019-04-19 17:52:20

标签: bash

我想将几个子目录下的所有文件移动到主目录。这些文件都以相同的方式命名,因此要通过添加它们所在子目录的前缀来区分它们。

/shop/user

我希望它们都在脚本运行的主目录下。

maindir 
   - dir1 - dir12 -filea
                  -fileb
          - dir13 -dir131 - filea
                  -dir132 - filea
   - dir2 - filea
          - fileb
          - filec
   - dir3
     

dir1_dir12_filea
dir1_dir12_fileb
.
.
dir2_filea
dir2_fileb
dir2_filec
.
.

但它仅循环遍历1个子目录级别

2 个答案:

答案 0 :(得分:1)

您只想用copyNextSampleBuffer中的/替换所有_。不需要$fdirname

basename

答案 1 :(得分:0)

在要查看复制文件的根目录旁边运行以下命令

find * -mindepth 1 -type f | sed -n 'p;s@/@_@gp' | sed 'N;s@\n@ @' | xargs -n2 mv

如果要确保它在执行正确的命令时不会弄乱所有内容,请首先尝试从同一目录进行跟踪。

find * -mindepth 1 -type f | sed -n 'p;s@/@_@gp' | sed 'N;s@\n@ @' | xargs -n2 echo mv

这只会回显将要执行的所有命令。如果对此感到满意,请不要回声。


说明:

首先执行sed

sed -n 'p;s@/@_@gp'

这将按以下顺序在每一行上执行以下操作,

  1. p:按原样打印当前行

  2. s@/@_@gp:将输入行的所有/个字符替换为_个字符并进行打印(在下一行中)。 g(全局)标志用于替换以对所有字符执行。否则,如果在第一次替换之后存在。

现在我们有两条输出线用于单个输入。

例如

如果第一个find结果是root/dir/file1,则需要生成以下命令,

mv root/dir/file1 root_dir_file1

以下两行位于第一个sed管道的末尾

root/dir/file1
root_dir_file1

如果这两行用空格合并在一起,我们将得到mv命令的参数。第二个sed就是为了这个。

第二次sed执行:

sed 'N;s@\n@ @'

这将按以下顺序在每一行上执行以下操作,

  1. N:将当前输入行(模式空间中的行)与下一条输入行连接在一起,并在其间插入换行符。
  2. s@\n@ @:用空格删除换行符

现在我们有了必需的mv参数。 xargs完成其余工作。