我有大量目录,每个目录都包含一个文件。结构如下:
.
├── 1.apple
│ └── foo.txt
├── 10.banana
│ └── foo.txt
├── 101.orange
│ └── foo.txt
├── <number>.<different strings>
│ └── <same strings>
我想将这些单个文件上移一级,重命名它们以反映它们当前所在的子目录的名称,然后删除该子目录。结果应该是这样的:
.
├── 1.apple.txt
├── 10.banana.txt
├── 101.orange.txt
也许awk
正则表达式可以完成这个任务,但我不知道如何写。
答案1
您应该能够使用一个简单的 shell 循环来完成此操作,您可以在命令提示符下将其作为“one-liner”输入:
for d in */; do n="${d%/}".txt; mv "${d}foo.txt" "$n"; rmdir "$d"; done
这将迭代所有子目录(即当前目录中与模式匹配的项目*/
),并且
- 通过附加到进程中删除尾随的
.txt
目录名来生成新文件名( )$d
/
${d%/}
- 使用新名称将目录内的文件移动到当前目录
$n
,并且 $d
最后删除现在为空的目录。
为了安全起见,先尝试如下:
for d in */; do n="${d%/}".txt; echo "mv ${d}foo.txt $n; rmdir $d"; done
这只会打印循环将执行的命令,因此您可以在出现拼写错误或其他意外行为时进行修改。