【发布时间】:2011-09-01 02:57:08
【问题描述】:
使用 bash 将文件扩展名“.jpg”添加到无扩展名文件的好方法是什么?
【问题讨论】:
-
mv "${file}" "${file}.jpg"? -
在您看来,什么是“无扩展名文件”?它是一个名称中没有点的文件吗?
使用 bash 将文件扩展名“.jpg”添加到无扩展名文件的好方法是什么?
【问题讨论】:
mv "${file}" "${file}.jpg" ?
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done
【讨论】:
"${f%.jpg}" 是 bash shell 字符串操作。 ` ${string%substring}` 从 $string 后面删除 $substring 的最短匹配项。
.jpg添加到普通文件中。
.jpg 结尾?防止在末尾添加额外的.jpg
你可以使用重命名:
rename 's/(.*)/$1.jpg/' *
【讨论】:
rename from to file...
rename 工具:oylenshpeegul.typepad.com/blog/2011/12/…
另一种方式 - 没有循环
find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep 'JPEG image data' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.jpg
细分:
上面的命令是为了dry run,在它之后你应该去掉mv之前的“echo”
编辑 有人建议这里需要“将路径参数用引号括起来;避免在带有空格的路径上拆分参数”。
通常,此建议是正确的,在这种情况下则不是。因为,这里% 被shell 扩展替换不是,而是被xargs 在内部(直接)替换,所以% 将被正确替换,即使文件名中有空格。
简单演示:
$ mkdir xargstest
$ cd xargstest
# create two files with spaces in names
$ touch 'a b' 'c d'
$ find . -type f -print
./c d
./a b
# notice, here are spaces in the above paths
#the actual xargs mv WITHOUT quotes
$ find . -type f -print | xargs -I % mv % %.ext
$ find . -type f -print
./a b.ext
./c d.ext
# the result is correct even in case with spaces in the filenames...
【讨论】:
简单, cd 到您的文件所在的目录,然后:
for f in *;do mv $f $f.jpg;done
【讨论】:
for f in *;do mv "$f" "$f".jpg;done来支持文件名中的空格会更好。
试运行:
rename -n s/$/.jpg/ *
实际重命名:
rename s/$/.jpg/ *
【讨论】:
rename 工具:oylenshpeegul.typepad.com/blog/2011/12/…
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done;
【讨论】:
在我的情况下,我不知道文件类型,所以我在 filemv 命令/strong> 命令检查并可能找到文件类型。此解决方案可能并不适合所有文件,因为 file 命令可能无法识别文件类型,但它对我来说最有效。
for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f" "$f.$ext"; done
awk 的用途是去除命令 file 返回的字符串的第二个单词,实际上是扩展名。
【讨论】:
rename --dry-run * -a ".jpg" # test
* -a ".jpg" # rename
【讨论】:
--dry-run 和 -a 在我的 rename 版本中不可用。如果这是特定于某些架构的,则应指定它。
rename 工具,因此不同系统中的语法可能会有所不同。请参阅oylenshpeegul.typepad.com/blog/2011/12/… 了解更多信息。
您可以使用move multiple files。我是这个项目的维护者。语法很简单。
mmf files*
它将使用所有文件名打开您的 $EDITOR,或者默认情况下打开 vim,您可以简单地使用 Ctrl+v+G 在 vim 中突出显示所有文件名的结尾,保存文件,退出它,您的所有文件改名了
【讨论】:
李安
将文件扩展名添加到目录中没有文件扩展名的多个文件的正确语法是
find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then mv "$FILE" "$FILE".eml; fi; done;
【讨论】: