将目录名称附加到文件末尾并移动它们

时间:2015-05-07 20:10:32

标签: linux bash unix

我使用此命令在目录中找到一些文件:

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。如何以有效的方式实现这一目标?

3 个答案:

答案 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是重命名文件的目标目录。辅助脚本通常提供执行必要验证的能力,否则将无法在单行中完成。