2015-05-07 35 views
2

我使用这个命令查找目录中的某些文件:追加目录名文件的末尾,移动它们

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

我真的不明白要求“..通过追加..将这些文件移动到不同的目录。”。你如何通过追加来移动?或者你的意思是说你想重命名这些文件(在文件名末尾附加-test),然后将它们移动到一个新的目录中? – mattias

+1

你在你的例子中明白'/ Users/myname/test01/logs1/std'是否被'/ Users/myname/test01/logs2/std'覆盖了'std-test01'? –

回答

1

你可以把它从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 
+0

简单而高效。非常感谢 !只是一个校正是{print $ 6“ - ”$ 4} :) – ani0710

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,'

+0

它的工作原理。谢谢 ! – ani0710

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是重命名的文件的目标目录。助手脚本通常提供进行必要验证的功能,否则这些验证不会在单线程中完成。