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