根据路径中的目录名称追加(重命名)和移动文件

根据路径中的目录名称追加(重命名)和移动文件

目标:仅追加(重命名)并移动那些文件路径包含任何级别的特定目录名称。

根据目录名称从树中提取文件。从多年的定期移动备份中,尝试提取(移动)目录中的那些文件任何父目录的匹配自定义“媒体目录列表”上的名称。附加完整路径作为每个文件的前缀,并将附加文件放入单个 OUTPUT 目录中。 (使用文件扩展名作为选择器对我的目的不起作用,必须是父目录名称之一。)例如,

输入目录(每个目录都有许多子目录):

20011231-bkp-1
20021231-bkp-2
20031231-bkp-3

输出(单个“OUTPUT”目录中的附加文件):

20011231-bkp-1__dir-a__dir-b__dir-c__WhatsApp Images__imag-1.jpg
20021231-bkp-2__dir-a__dir-b__dir-c__WhatsApp Images__Sent__imag-1.jpg
20031231-bkp-3__dir-a__Camera__imag-1.mp4
20031231-bkp-3__dir-a__Camera__dir-x__imag-1.mp4

媒体目录列表(这些目录可以位于路径中的任何位置,注意空格)。仅重命名和移动所有文件其中,完全匹配,递归地:

WhatsApp Images
WhatsApp Audio
Recorders
Camera

这适用于附加和移动,但限制困难仅有的到“媒体目录列表”内的那些文件:

find 1 -type f| perl -ne 'chop;$from=$_;$to=$_;$to=~s/\//__/g;system("echo mv $from $to")'

答案1

我会用find -path "..." -exec bash -c '...'

find *-bkp-* \
  \( \
    -path "*/WhatsApp Images/*" \
    -or -path "*/WhatsApp Audio/*" \
    -or -path "*/Recorders/*" \
    -or -path "*/Camera/*" \
  \) \
  -exec bash -c '
    OUTPUT_DIR="OUTPUT"
    mkdir -p "$OUTPUT_DIR"
    for f in "$@"; do mv -v "$f" "$OUTPUT_DIR/${f//\//_}"; done
  ' find-sh {} +

您可能想要添加一个标志来控制现有文件应该发生的情况,例如-n不覆盖现有文件-f以强制覆盖或-b备份现有文件。

相关内容