如何将每个子目录中唯一的文件移动到外部并更名为目录名?

如何将每个子目录中唯一的文件移动到外部并更名为目录名?

我有大量目录,每个目录都包含一个文件。结构如下:

.
├── 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

这只会打印循环将执行的命令,因此您可以在出现拼写错误或其他意外行为时进行修改。

相关内容