我想将几个子目录下的所有文件移动到主目录。这些文件都以相同的方式命名,因此要通过添加它们所在子目录的前缀来区分它们。
/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个子目录级别
答案 0 :(得分:1)
您只想用copyNextSampleBuffer
中的/
替换所有_
。不需要$f
或dirname
。
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'
这将按以下顺序在每一行上执行以下操作,
p
:按原样打印当前行
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@ @'
这将按以下顺序在每一行上执行以下操作,
N
:将当前输入行(模式空间中的行)与下一条输入行连接在一起,并在其间插入换行符。s@\n@ @
:用空格删除换行符现在我们有了必需的mv
参数。 xargs
完成其余工作。