追加目录名文件的末尾,移动它们
我使用这个命令查找目录中的某些文件:追加目录名文件的末尾,移动它们
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。如何以有效的方式实现这一点?
你可以把它从DST到dst_dir
追加目录移动,使用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
简单而高效。非常感谢 !只是一个校正是{print $ 6“ - ”$ 4} :) – ani0710
你可以让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,'
它的工作原理。谢谢 ! – ani0710
有事情,你可能需要使用一个辅助脚本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
是重命名的文件的目标目录。助手脚本通常提供进行必要验证的功能,否则这些验证不会在单线程中完成。
我真的不明白要求“..通过追加..将这些文件移动到不同的目录。”。你如何通过追加来移动?或者你的意思是说你想重命名这些文件(在文件名末尾附加-test),然后将它们移动到一个新的目录中? – mattias
你在你的例子中明白'/ Users/myname/test01/logs1/std'是否被'/ Users/myname/test01/logs2/std'覆盖了'std-test01'? –