我使用此命令在目录中找到一些文件:
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
我需要通过将 test> test 目录名称附加到文件末尾来将此文件移至其他目录。如下:
err.log-test01
std-test01
std-test01
velocity.log-test02
err.log-test03
invalid-arg-test03
我正在尝试使用剪切命令,但没有获得所需的输出。
find /Users/myname -type f | cut -d'/' -f6,4
加上,我还需要将文件移至其他目录。我想使用SED命令可能会有一种合适的方法,但我不熟练。如何以有效的方式实现这一目标?
您可以让find
创建mv
命令,使用SED修改它,然后由Shell运行:
find /Users/myname -type f -printf "mv %p /other/dir/%fn" |
sed 's,/(test[0-9]*)/(.*),/1/2-1,' | sh
这假定任何参数中都没有空格,否则会自由地添加'
或"
。还可以在没有最终| sh
的情况下运行它,以查看其实际要做的事情。如果您需要更好地锚定test[0-9]*
模式,则可以包括左或右字符串的一部分以匹配:
's,myname/(test[0-9]*)/(.*),myname/1/2-1,'
您可以使用awk
将其从DST移动到附加目录的dst_dir
,目标名称为awk -F/ '{print $5 "-" $4}'
。完整命令可以像:
for i in `find . -type f`
do mv $i /dst_dir/`echo $i| awk -F/ '{print $5 "-" $4}' `
done
有很多事情正在发生,您可能想使用带有find
的助手脚本来确保您可以验证目录的存在以将文件移至等等。脚本可能采用:
#!/bin/bash
[ -z $1 -o -z $2 ] && { # validate at least 2 arguments
printf "error: insufficient inputn"
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
是重命名文件的目标目录。助手脚本通常提供了进行必需验证的能力,否则在单线中不会进行。