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

How to keep subdirectory path while copying into a new file?

使用以下命令,我可以搜索 /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 [=10=] newdir/${f//\//_}' {} \;

要查看这将对文件进行哪些更改,您可以预先 运行 这个版本(与命令相呼应 运行):

find olddir -iname "*.html" -type f -exec bash -c 'f=${0#olddir/}; echo mv [=11=] 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 [=13=] 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

运行ning 命令后的示例:

$ 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