通过文件重命名将多个文件夹中的文件复制到一个文件夹中



我遇到过这样的问题。

我有一个藏书,文件夹和文件结构如下:

/oldfolder/0000 Daniel Defoe - Robinson Crusoe/Daniel Defoe - Robinson Crusoe.fb2
/oldfolder/0001 Jules Verne - The Mysterious Island/Jules Verne - The Mysterious Island.fb2
/oldfolder/0002 Jules Verne - Twenty Thousand Leagues under the Sea/Jules Verne - Twenty Thousand Leagues under the Sea.fb2
/oldfolder/0003 Henry Freeman - Sumerians: A History From Beginning to End/Henry Freeman - Sumerians: A History From Beginning to End.fb2
/oldfolder/0004 Henry Freeman - War of 1812: A History From Beginning to End/Henry Freeman - War of 1812: A History From Beginning to End.fb2

我想将所有文件复制到一个文件夹中,并将父目录的第一个字(索引号)添加到文件名中:

/newfolder/0000 Daniel Defoe - Robinson Crusoe.fb2
/newfolder/0001 Jules Verne - The Mysterious Island.fb2
/newfolder/0002 Jules Verne - Twenty Thousand Leagues under the Sea.fb2
/newfolder/0003 Henry Freeman - Sumerians: A History From Beginning to End.fb2
/newfolder/0004 Henry Freeman - War of 1812: A History From Beginning to End.fb2

不幸的是,我不擅长写脚本-只是学习。我可以将所有文件复制到一个文件夹中,问题是添加父文件夹名称中的第一个单词。

我尝试了不同的选项。例如:

find -name *.fb2 -execdir sh -c 'f={} d=$( pwd | awk -F / '{print $NF}' | awk '{print $1}'

提前感谢您的回复。

nd=newfolder; mkdir -p "$nd"; find . -name "*.fb2" -exec bash -c 'f="{}"; nf="${f##*/}"; i="${f%/*}"; i="${i##*/}"; i="${i%% *}"; mv -v "${f}" "'${nd}'/${i} ${nf}"' ;

我不确定在发生错误的情况下您想要做什么,因此我采取了更安全的方法,如果操作失败或找到意外的文件,则中止。通过使用ln而不是复制或移动数据,旧目录保持不变,因此您可以多次执行该操作,仅在完成时删除旧目录树:

mkdir newdirectory && for d in oldfolder/*; do flag=0; 
for f in "$d"/*; do 
if test $((flag++)) -ne 0; then echo "Unexpected file found: '$f'" >&2; break 2; fi; 
ln "$f" newdirectory/"${d#oldfolder/}".fb2 || break 2; done; done

最新更新