我试图在Linux上学习bash,只是为了好玩。我认为有一个将类似文件组合在一起的.sh会非常有用。例如,假设我们有目录
/家庭/文档/
在目录中我们有/ mathdocs /,/ codingdocs /等等。
在这些子目录中,我们都有doc.txt。子目录上所有文件的名称相同。
让我们说我想将它们组合在一起,我想将所有文件移动到/ home / allthedocs /并在它们所在的目录之后重命名它们。(mathdocs.txt,codingdocs.txt等。)
我怎么能这样做?
我已尝试根据ls和cp命令创建脚本,但我不知道如何在移动它们之后将目录名称重命名为其中的文件。我想它必须是某种迭代句子(对于Y目录上的X)但我不知道该怎么做。
答案 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