复制到新文件时如何保留子目录路径?
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
您可以使用 basename
和 dirname
作为路径。
#!/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
使用以下命令,我可以搜索 /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
您可以使用 basename
和 dirname
作为路径。
#!/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