文件夹中每个文件的 bash 命令

Rob*_*ert 53 command-line bash

我有一组文件,我想在这些文件上应用相同的命令,输出应包含与已处理文件相同的名称,但具有不同的扩展名。

目前我正在将 /my/data/Andrew.doc 重命名为 /my/data/Andrew.txt 我想对 /my/data/ 文件夹中的所有 .doc 文件执行此操作并保留名称。

我尝试了几个版本,但我想我的语法有问题,因为我是 linux 新手。

Oli*_*Oli 108

至少有十亿种不同的方法来解决这个问题,但这里是最重要的竞争者:

Bash for 循环

for f in ./*.doc; do
    # do some stuff here with "$f"
    # remember to quote it or spaces may misbehave
done
Run Code Online (Sandbox Code Playgroud)

使用 find

find命令有一个可爱的小exec命令,非常适合运行(有一些警告)。Find 比基本的 globbing 更好,因为您可以真正过滤您正在选择的文件。小心奇怪的语法。

find . -iname '*.doc' -exec echo "File is {}" \;
Run Code Online (Sandbox Code Playgroud)

请注意,这find是递归的,因此您可能希望-maxdepth 1用于保留find在当前工作目录中。-type f可用于过滤掉常规文件。

如果我们只是doc重命名为 txt ...

rename命令在搜索中类似于 sed。显然,这不会对转换格式做任何事情。

rename 's/doc$/txt/' *.doc
Run Code Online (Sandbox Code Playgroud)

  • 对于 for..loop 示例:我注意到,如果子目录 `./*.doc` 中没有文件,则无论如何都会使用字符串“./*.doc”执行循环。检查 $f 是否是一个文件可能是个好主意:`if [ -f $f ]; 然后...fi` (2认同)

小智 31

for i in *.doc ; do mv "$i" $(echo $i | sed s/doc/txt/) ; done
Run Code Online (Sandbox Code Playgroud)

  • 在 'sed' 中,您必须将 'doc' 替换为 'doc$'(以 'doc' 结尾),以防止出现“doc_doc.doc”之类的名称导致“txt_doc.doc”的问题。=> sed s/doc$/txt/ (2认同)