我使用此命令在目录中找到一些文件:
find /Users/myname -type f
输出是:
/Users/myname/test01/logs1/err.log
/Users/myname/test01/logs1/std
/Users/myname/test01/logs2/std
/Users/myname/test02/logs2/velocity.log
/Users/myname/test03/logs3/err.log
/Users/myname/test03/logs3/invalid-arg
我需要将测试目录名称附加到文件末尾,将此文件移动到其他目录。如下所示:
err.log-test01
std-test01
std-test01
velocity.log-test02
err.log-test03
invalid-arg-test03
我正在尝试使用cut命令,但没有获得所需的输出。
find /Users/myname -type f | cut -d'/' -f6,4
另外,我还需要将文件移动到其他目录。我猜一个合适的方法可能是使用sed命令,但我不熟悉sed。如何以有效的方式实现这一目标?
答案 0 :(得分:2)
您可以让find
创建mv
命令,使用sed修改它,然后让它由shell运行:
find /Users/myname -type f -printf "mv %p /other/dir/%f\n" |
sed 's,/\(test[0-9]*\)/\(.*\),/\1/\2-\1,' | sh
这假设任何参数中都没有空格,否则会自由地添加'
或"
。也可以在没有最终| sh
的情况下运行它以查看它实际上想要做什么。如果您需要更好地锚定test[0-9]*
模式,可以包含左侧或右侧字符串的一部分以匹配:
's,myname/\(test[0-9]*\)/\(.*\),myname/\1/\2-\1,'
答案 1 :(得分:1)
您可以使用dst_dir
将其从dst移至附加目录的awk
,目标名称为awk -F/ '{print $5 "-" $4}'
。完整命令可以简单如下:
for i in `find . -type f`
do mv $i /dst_dir/`echo $i| awk -F/ '{print $5 "-" $4}' `
done
答案 2 :(得分:0)
有很多事情你可能想要使用find
的帮助脚本来确保你可以验证目录是否存在以便将文件移动到等等。脚本可能需要形式:
#!/bin/bash
[ -z $1 -o -z $2 ] && { # validate at least 2 arguments
printf "error: insufficient input\n"
exit 1
}
ffn="$1" # full file name provided by find
newdir="$2" # the target directory
# validate existence of 'newdir' or create/exit on failure
[ -d "$newdir" ] || mkdir -p "$newdir"
[ -d "$newdir" ] || { printf "error: uname to create '$newdir'\n"; exit 1; }
tmp="${ffn##*test}" # get the test## number
num="${tmp%%/*}"
fn="${ffn##*/}" # remove existing path from ffn
mv "$ffn" "${newdir}/${fn}-test${num}" # move to new location
exit 0
将其保存在可以myscript
之类的名称访问的位置,并使其可执行(例如chmod 0755 myscript
)您也可以选择将其放在路径中的目录中。然后,您可以使用以下内容为find
返回的每个文件调用脚本:
find /Users/myname -type f -exec ./path/to/myscript '{}' somedir \;
其中somedir
是重命名文件的目标目录。辅助脚本通常提供执行必要验证的能力,否则将无法在单行中完成。