移动文件并在Bash上包含它的目录之后重命名它

时间:2017-06-11 20:57:15

标签: linux bash

我试图在Linux上学习bash,只是为了好玩。我认为有一个将类似文件组合在一起的.sh会非常有用。例如,假设我们有目录

/家庭/文档/

在目录中我们有/ mathdocs /,/ codingdocs /等等。

在这些子目录中,我们都有doc.txt。子目录上所有文件的名称相同。

让我们说我想将它们组合在一起,我想将所有文件移动到/ home / allthedocs /并在它们所在的目录之后重命名它们。(mathdocs.txt,codingdocs.txt等。)

我怎么能这样做?

我已尝试根据ls和cp命令创建脚本,但我不知道如何在移动它们之后将目录名称重命名为其中的文件。我想它必须是某种迭代句子(对于Y目录上的X)但我不知道该怎么做。

2 个答案:

答案 0 :(得分:0)

您可以使用mv一次性移动和重命名文件,并使用循环通过glob抓取所有文件:

#!/bin/bash

dest_dir=/home/allthedocs

cd /home/docs
for file in */doc.txt; do
  [[ -f "$file" ]] || continue # skip if not a regular file
  dir="${file%/*}"             # get the dir name from path
  mv "$file" "$dest_dir/$dir.txt"
done

有关详细信息,请参阅此帖子:

答案 1 :(得分:0)

这是一个单行解决方案,用于处理文件名中的空格,就像@codeforester解决方案对glob一样。

请注意,使用" -print0"处理空格。选项传递给"查找",while循环中的内部字段分隔符(IFS)以及带引号的file3变量的包装。

从file2到file3的参数替换摆脱了前导" ./"。

move命令中的参数substition将路径转换为文件名(在/ home / docs /下运行):

find . -maxdepth 2 -mindepth 2 -print0 | while IFS= read -r -d '' file; \
do file2=$(printf '%s\n' "$file"); file3=${file2#*\/*}; \
mv "$file2" ../allsil/"${file3//\//}"; done