所以我是一个编码新手,并且有一段时间,想要编辑我相当广泛的现场音乐库的格式。我在这里和其他各种资源一起环顾四周,但是我遇到了麻烦。我有以下列方式命名的目录:
我想将这些简单地重命名为
我可以使用以下方法正确重命名日期:
ls -1 | grep 90 | awk '{print $1}' | awk -F. '{printf "%s-%s-%s\n", "19"$3,$1,$2}' > list1.txt
然后使用
拉出名称的其余部分ls -1 | grep 90 | awk '{first = $1; $1 = ""; print $0}'>list2.txt
所以,我有一个目录列表,从1990年到2004年,我想将它应用到(它们都在不同的子目录中,所以我不介意手动更改" grep 90& #34;。然而,从我生成的两个单独的列表中,我无法弄清楚如何使其遍历每一行并打印" mv original_name list1.txt + list2.txt"以便它将读取:
mv 02.10.90 | 23 East Caberet - Ardmore, PA 1990-02-10 | 23 East Caberet - Ardmore, PA
我浏览过很多以前的帖子,无法弄清楚最后一点 - 或者更好,更优雅的解决方案!非常感谢任何帮助,谢谢你提前!
答案 0 :(得分:0)
不要解析ls
的输出,google为什么,当你使用awk时你不需要grep,也不需要awk命令链但是为此任务,你不会使用任何这些命令。
查找文件的UNIX命令名为find
,所以从这开始。这将找到名称以给定的globbing模式开头的所有目录:
find . -type d -name '[0-9][0-9].[0-9][0-9].90 *'
现在您已找到需要对其执行操作的文件。为了您的需求恕我直言,最简单的方法是最好的,那就是:
find . -type d -name '[0-9][0-9].[0-9][0-9].90 *' -print0 |
while IFS= read -r -d '' old; do
path="$(dirname "$old")"
oldDirName="$(basename "$old")"
if [[ oldDirName =~ ([0-9]+)\.([0-9]+)\.([0-9]+)( .*) ]]; then
newDirName="19${BASH_REMATCH[3]}-${BASH_REMATCH[1]}-${BASH_REMATCH[2]}${BASH_REMATCH[4]}
echo mv -- "${path}/${oldDirName}" "${path}/${newDirName}"
fi
done
以上是使用GNU find for -print0和bash for BASH_REMATCH。如有必要,请在调试后删除echo
,并对其将要执行的操作感到满意。