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

  • 本文关键字:移动 文件 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

我需要通过将 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是重命名文件的目标目录。助手脚本通常提供了进行必需验证的能力,否则在单线中不会进行。

相关内容

  • 没有找到相关文章

最新更新