使用前置父目录名称重命名文件

使用前置父目录名称重命名文件

需要批量重命名在其父目录名称前面添加的文件,而不使用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/\//_}正在/用下划线替换斜杠_。指向1find_bash一个参数,即传递的文件路径{}

(替换echocp复制或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

相关内容