我知道这个话题已经被讨论过了(请在这里以及其他地方),但是请您放纵一下,因为我正试图通过bash脚本艺术找到自己的方式。
我需要解决以下问题
鉴于我有:
目录1
目录2
我想重命名文件,以便
目录1
目录2
到目前为止,我已经设法制定出以下“探索性” bash脚本
for d in `ls -d */`
do
#echo "$d"
pre="${d:0:-1}"
#echo "$pre"
#cd "${d}"
pushd "${d}"
for f in *.jp2
do
#echo "${f}"
echo "${pre}_${f}"
done
#cd -
#popd
done
除了错误消息外,它似乎工作正常(相当)
line 9: pushd: dir2/: No such file or directory
其中dir2是被for循环扫过的最后一个dir的名称...
有什么帮助吗?我想念的是什么?
而不是尝试cd
来回进入目录(popd
并且pushd
主要是用于交互式使用):
#!/bin/sh
for name in */*; do
[ ! -f "$name" ] && continue
dir="$( basename "$( dirname "$name" )" )"
newname="$dir/${dir}_${name##*/}"
if [ ! -e "$newname" ]; then
echo mv "$name" "$newname"
fi
done
这将遍历当前目录中所有目录中的所有名称。它将跳过非文件,并将目录基本名称(没有路径的目录名称)提取到中dir
。然后,它$newname
使用$dir
和中的路径名的basename部分$name
(${name##*/}
可以用替换$( basename "$name" )
)为文件构造一个新的文件名。
如果尚未使用新名称,则文件将被重命名。
echo
确认应该执行正确的操作后,删除即可实际重命名文件。
要在另一个目录中执行一组操作然后返回,请使用
( cd dir
action
action
action )
更改后的目录不会影响之外的环境( ... )
。
另请参阅:为什么*不*解析`ls`?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句