![根据部分目录名称重命名多个目录中的文件](https://linux22.com/image/197533/%E6%A0%B9%E6%8D%AE%E9%83%A8%E5%88%86%E7%9B%AE%E5%BD%95%E5%90%8D%E7%A7%B0%E9%87%8D%E5%91%BD%E5%90%8D%E5%A4%9A%E4%B8%AA%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6.png)
我在一个位置有许多目录,其中包含各种扩展名的文件。这些目录遵循标准约定,但其中的文件则不然。我试图找到的解决方案是根据每个文件夹中的文件所在目录的一部分来重命名每个文件夹中的文件,以获取我必须浏览的文件夹列表。
例如:
目录:001234@Redsox#17
file1.pdf
file7A.doc
spreadsheet.xls
输出:
[email protected]
[email protected]
[email protected]
对每个目录进行后续操作,仅重命名目录名称中附加的代码。我已经有了一个用于整个过程操作的基本框架,但我不确定如何最好地获取我需要的目录部分
for directory in *; do
pushd "$directory"
index=1
for filename in *; do
target_filename="${directory}$????${filename}"
mv "$filename" "${target_filename}"
((index++))
done
popd
done
答案1
我会做这样的事情:
# nullglob
# If set, Bash allows filename patterns which match no files to
# expand to a null string, rather than themselves.
shopt -s nullglob
# instead of looping through the dirs, loop through the files
# add al the possible extensions in the list
$ for f in */*.{doc,pdf,xls,txt}; do
# get the file dirname
d=$(dirname "$f")
# using parameter expansion get the part
# of the dirname you need
echo mv -- "$f" "$d/${d%%@*}@$(basename "$f")"
# when you are satisfied with the result, remove the `echo`
done
$ ls -1 001234@Redsox#17/
[email protected]
[email protected]
[email protected]