使用以下命令,我可以从/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
您可以使用 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