如何在复制到新文件时保留子目录路径



使用以下命令,我可以从/olddir中搜索所有子目录并将*.html文件复制到/newdir

find /olddir -iname "*.html" -type f -exec cp {} /newdir/ ;

但是我如何保留子目录信息,例如:

/olddir/some/foobar/path/abc.html

应复制到/newdir作为绝对路径

/newdir/some_foobar_path_abc.html

假设没有子目录名称包含下划线 _

输入示例目录:

/olddir
  /somesubdir
    foobarfile.html
  helloworld.html

期望输出:

/newdir
  somesubdir_foobarfile.html
  helloword.html
您可以使用

find命令:

find olddir -iname "*.html" -type f -exec bash -c 'f=${0#olddir/}; mv $0 newdir/${f////_}' {} ;

要查看这将进行哪些文件更改,您可以事先运行此版本(它回显要运行的命令):

find olddir -iname "*.html" -type f -exec bash -c 'f=${0#olddir/}; echo mv $0 newdir/${f////_}' {} ;

之前的例子:

$ tree olddir
olddir
|-- f1
|-- f2
`-- subdir
    |-- f3
    |-- subdir_three
    |   `-- f6
    `-- subdir_two
        |-- f4
        `-- f5
$ tree newdir
newdir/

回显示例:

$ find olddir -type f -exec bash -c 'f=${0#olddir/}; echo mv $0 newdir/${f////_}' {} ;
mv olddir/subdir/subdir_two/f4 newdir/subdir_subdir_two_f4
mv olddir/subdir/subdir_two/f5 newdir/subdir_subdir_two_f5
mv olddir/subdir/subdir_three/f6 newdir/subdir_subdir_three_f6
mv olddir/subdir/f3 newdir/subdir_f3
mv olddir/f1 newdir/f1
mv olddir/f2 newdir/f2

运行命令后的示例:

$ tree olddir
olddir
`-- subdir
    |-- subdir_three
    `-- subdir_two
$ tree newdir/
newdir/
|-- f1
|-- f2
|-- subdir_f3
|-- subdir_subdir_three_f6
|-- subdir_subdir_two_f4
`-- subdir_subdir_two_f5

您可以使用 basenamedirname 作为路径。

#!/bin/bash
files=$(find /root/old -iname "*.html" -type f)
for f in $files
do
dir=$(dirname $f | sed 's/^.//' | sed 's///_/g')
name=$(basename $f)
cp $f /root/new/"$dir"_"$name"
done
  • 在/root/old 目录中查找 html 文件。
  • 获取目录名称,删除第一个字符,替换其他/到 _ 字符。
  • 获取基名称。
  • 将 html 文件复制到/root/new/your_old_path_filename.html

输入:

/root/old/oldsub1/oldsub2/test3.html
/root/old/oldsub1/test2.html
/root/old/test1.html

输出:

/root/new/root_old_oldsub1_test2.html
/root/new/root_old_test1.html
/root/new/root_old_oldsub1_oldsub2_test3.html

相关内容

最新更新