需要批量重命名在其父目录名称前面添加的文件,而不使用rename
命令。
例如
/tmp/2017-09-22/cyber.gz
/tmp/2017-09-23/cyber.gz
/tmp/2017-09-24/cyber.tar
还必须复制重命名的文件/tmp/archive
而不影响上述原始文件。
看起来像下面这样
/tmp/archive/2017-09-22_cyber.gz
/tmp/archive/2017-09-23_cyber.gz
/tmp/archive/2017-09-24_cyber.tar
答案1
如果不在这里使用,rename
你可以这样做Shell (Bash, ksh, ksh93, mksh, zsh) Pattern substitution expansion
。
find * -path "archive" -prune -o -type f -exec \
bash -c 'echo "$1" "archive/${1/\//_}"' find_bash '{}' \;
-path "archive" -prune
不包括archive
目录本身。${1/\//_}
正在/
用下划线替换斜杠_
。指向1
第find_bash
一个参数,即传递的文件路径{}
。
(替换echo
为cp
复制或mv
移动文件)
目录结构:
.
├── 2017-09-22
│ └── cyber.gz
├── 2017-09-23
│ └── cyber.gz
├── 2017-09-24
│ └── cyber.tar
└── archive
执行命令后:
.
├── 2017-09-22
│ └── cyber.gz
├── 2017-09-23
│ └── cyber.gz
├── 2017-09-24
│ └── cyber.tar
└── archive
├── 2017-09-22_cyber.gz
├── 2017-09-23_cyber.gz
└── 2017-09-24_cyber.tar
答案2
使用简短的 shell 脚本:
#!/bin/sh
archive='/tmp/archive'
mkdir -p "$archive"
for name in /tmp/????-??-??/*; do
dirdate=${name%/*} # dirdate=$(dirname "$name")
dirdate=${dirdate##*/} # dirdate=$(basename "$dirdate")
newname="$archive/${dirdate}_${name##*/}"
if [ ! -e "$newname" ]; then
echo cp "$name" "$newname"
fi
done
这会挑选出dirdate
以日期为名称的目录的基本名称,并使用它为内部的每个文件创建一个新名称。
如果目录中不存在新名称archive
,则文件将复制到该目录。
从上面的脚本中删除echo
以实际执行复制。
对于给定的示例,脚本将执行以下操作:
cp /tmp/2017-09-22/cyber.gz /tmp/archive/2017-09-22_cyber.gz
cp /tmp/2017-09-23/cyber.gz /tmp/archive/2017-09-23_cyber.gz
cp /tmp/2017-09-24/cyber.tar /tmp/archive/2017-09-24_cyber.tar