批处理文件重命名,其中旧名称的一部分成为目录
Batch file rename where part of the old name became directories
我不知道使用 bash 是否可行,但如果能够仅使用 bash.
就更好了
我(定期)收到一堆具有以下名称模式的文件:
xxx___yyy___abc__def.pdf
xxxa___y_yy___fg-h___ijdfdak.pdf
xx___v-vv___a_fasl-bk___os___23l.pdf
- 等等
我需要重命名并将它们移动到目录中:
~/xxx/yyy/abc/def.pdf
~/xxxa/y_yy/fg-h/ijdfdak.pdf
~/xx/v-vv/a_fasl-bk/os/23l.pdf
可能吗?请帮忙。
根据两个参数创建一个文件夹,例如
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'
我不知道使用 bash 是否可行,但如果能够仅使用 bash.
就更好了我(定期)收到一堆具有以下名称模式的文件:
xxx___yyy___abc__def.pdf
xxxa___y_yy___fg-h___ijdfdak.pdf
xx___v-vv___a_fasl-bk___os___23l.pdf
- 等等
我需要重命名并将它们移动到目录中:
~/xxx/yyy/abc/def.pdf
~/xxxa/y_yy/fg-h/ijdfdak.pdf
~/xx/v-vv/a_fasl-bk/os/23l.pdf
可能吗?请帮忙。
根据两个参数创建一个文件夹,例如
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'