我使用以下简单的代码行成功地从目录中的所有文件名中删除指定的单词:
for file in *.* ; do mv "${file}" "${file//UNWANTEDWORD}"; done
但是我可以向该代码添加什么来仅指定目录中的子目录而不是文件?
重申一下:我想从包含目录和文件的目录中的每个子目录名称中删除一个特定的单词,并且不影响文件。有什么想法吗?
答案1
注意:这假设你原来的 glob 表达式*.*
是正确的,即你希望循环遍历名称包含句点字符的目录,例如foo.bar
你可以在 shell glob 中*.*
添加后缀,使其仅匹配目录/
:
for file in *.*/ ; do mv "${file}" "${file//UNWANTEDWORD}"; done
或者,添加一个简单的目录测试:
for file in *.* ; do [ -d "$file" ] && mv "${file}" "${file//UNWANTEDWORD}"; done
答案2
尝试:
find ./dir1 -depth -type d -name '*UNWANTEDWORD*' -exec bash -c 'mv "${1}" "${1//UNWANTEDWORD}"' mv {} \;
以上代码递归搜索目录结构。如果只想操作当前目录中的文件,.
则运行:
find ./dir1 -maxdepth 1 -depth -type d -name '*UNWANTEDWORD*' -exec bash -c 'mv "${1}" "${1//UNWANTEDWORD}"' mv {} \;
怎么运行的
find ./dir1
启动一个
find
命令并告诉它在哪个目录中查找。如果要从当前目录开始,请替换./dir1
为.
。-depth
在目录本身之前搜索每个目录的内容。
-type d
仅搜索目录。
-name '*UNWANTEDWORD*'
将搜索限制在包含 的目录名中
UNWANTEDWORD
。在没有这个词的目录上浪费时间是没有意义的。-exec bash -c 'mv "${1}" "${1//UNWANTEDWORD}"' move {} \;
对找到的每个文件运行你的 shell 命令。
(在上面,当执行 shell 命令时,字符串
move
被分配给$0
。这并不重要,除非 shell 代码生成错误,在这种情况下错误消息将用作$0
脚本名称。)