批处理文件重命名,其中旧名称的一部分成为目录

Batch file rename where part of the old name became directories

我不知道使用 bash 是否可行,但如果能够仅使用 bash.

就更好了

我(定期)收到一堆具有以下名称模式的文件:

我需要重命名并将它们移动到目录中:

可能吗?请帮忙。

根据两个参数创建一个文件夹,例如

mkdir -p ~/xxx/yyy/abc

将文件移动到文件夹内

mv xxx___yyy___abc__def.pdf ~/xxx/yyy/abc/def.pdf

或者让脚本接受文件作为参数

#!/bin/bash
FOLDER="$(echo  | tr -s '_' | cut -d "_" -f1)"
SUBFOLDER="$(echo  | tr -s '_' | cut -d "_" -f2)"
SUBSUBFOLDER="$(echo  | tr -s '_' | cut -d "_" -f3)"
FILE="$(echo  | tr -s '_' | cut -d "_" -f4)"
mkdir -p "~/${FOLDER}/${SUBFOLDER}/${SUBSUBFOLDER}"
mv "" "~/${FOLDER}/${SUBFOLDER}/${SUBSUBFOLDER}/${FILE}"

用法:./script.sh xxx___yyy___abc__def.pdf

不花哨,但很管用。

使用参数扩展。

#!/bin/sh

for f in *.pdf; do
  last=${f##*_} first=${f%%_*} 
  third=${f%$last*} third="${third%??*}"
  third=${third##*_} second=${f%$third*}
  second=${second%???*} second=${second##*_}
  echo mkdir -p ~/"$first/$second/$third" && \                                                                                                                                               
  echo mv -v "$f" ~/"$first/$second/$third/$last"
done

根据 OP 问题的更新。应删除所有下划线。

#!/bin/bash

for f in *.pdf; do
  new=$(awk -F'[_]+' -vOFS='/' '{=}1' <<< "$f")
  echo mkdir -p ~/"${new%/*}/" && \
  echo mv -v "$f"  ~/"$new"
done
  • 删除 echo 以实际重命名文件。

没有echo

的实际输出
copied 'xx___v-vv___a_fasl-bk__os23l.pdf' -> '/home/Pelangi/xx/v-vv/a/fasl-bk/os23l.pdf'
removed 'xx___v-vv___a_fasl-bk__os23l.pdf'
copied 'xxxa___y_yy___fg-h__ijdfdak.pdf' -> '/home/Pelangi/xxxa/y/yy/fg-h/ijdfdak.pdf'
removed 'xxxa___y_yy___fg-h__ijdfdak.pdf'
copied 'xxx___vvv___abk__osl.pdf' -> '/home/Pelangi/xxx/vvv/abk/osl.pdf'
removed 'xxx___vvv___abk__osl.pdf'
copied 'xxx___yyy___abc__def.pdf' -> '/home/Pelangi/xxx/yyy/abc/def.pdf'
removed 'xxx___yyy___abc__def.pdf'
copied 'xxx___yyy___fgh__ijk.pdf' -> '/home/Pelangi/xxx/yyy/fgh/ijk.pdf'
removed 'xxx___yyy___fgh__ijk.pdf'