根据父文件夹移动和重命名文件

根据父文件夹移动和重命名文件

我正在尝试编写一个 Bash 函数,它将在给定的目录树中查找文件并将它们移动到当前文件夹,同时根据它们的父文件夹重命名它们,但我仍然停留在问题的前半部分;隔离文件的名称和它们的父目录。

将这些文件的列表放入变量中很容易,但操作这个变量来隔离它们的文件夹,然后将它们放入另一个变量中,感觉比它应该的要困难得多,或者我错过了一些明显的东西。

files=$(find * -type f -iname "*english.srt") 
for i in "$files"; do folders=(${files%%/*}; done;
echo $folders # returns only the name of the first folder

我在 Windows 10 上运行 Cygwin,但我测试的文件或文件夹中都没有空格。

答案1

喝了点咖啡,又花了几个小时思考,我终于想出了一个可行的解决方案。这可能不是最好的/最优雅的/最传统的方法,但对我来说效果很好,而且据我所知,它适用于任何文件扩展名的文件(除了硬编码的.srtfind命令中):

files=$(find * -type f -iname "*english.srt");
read -d ' ' -a file <<< "$files"; # split the results of `find` into a manageable array
for f in "${file[@]}"; do 
 parent=${f[@]%%/*}; # get the name of the file's parent folder
 ext=${f##*.} # get the file's extension 
 mv $f "./$parent.$ext"; # extract the file into the current dir, name it                   
done;                    # the same as its parent folder, then give it             
                         # back its extension

我现在像.bashrc这样成功地使用它:

function extract_subtitles() {
    files=$(find * -type f -iname "*english.srt");
    read -d ' ' -a file <<< "$files";
    for f in "${file[@]}"; do 
    parent=${f[@]%%/*};
    ext=${f##*.}
    mv $f "./$parent.$ext";
    done;
}

相关内容