Linux文件重命名

8

我试图在我的Linux系统上更改多个文件的名称。 我使用了rename 's/foo/bar/g' * 所有我想要更改名称的文件都在当前目录中。

它没有更改文件的名称,但我认为它应该。 如有帮助,将不胜感激。


2
尝试使用rename foo bar *命令,或者阅读manpage - hasufell
请查看重命名目录中的文件 - LinkBerest
Erwin,是的,我有更改文件的权限。 - robertdaleweir
hasufell "foo"只是各种名称中的一个字符串。 - robertdaleweir
hasufell,是的,你的代码有效。我正在尝试了解s///g如何工作以及为什么它对我无效。 - robertdaleweir
显示剩余4条评论
5个回答

17

一个简单的方法是:

mv file2rename newname

感谢您提供简短但非常有用的答案。 - ilyas varol
short and efficient, cool - Ikbel

3
您提到您想使用rename表达式一次重命名多个文件。从技术上讲,您不能仅使用*符号更改文件名。 *表示所有具有相同名称的文件。我们知道,同一文件类型不存在相同的名称,但您可以重命名文件的某些选定部分。例如

admin@home:~/works$ ls test*.c
test_car.c test_van.c test_dog.c

  • 你可以重命名这些文件的某些部分而不是全部名称。因为同一扩展名下不能存在相同的文件名

admin@home:~/works$ rename 's/test/practice/' *.c

  • 执行此命令后,每个test都将替换为practice

admin@home:~/works$ ls practice*.c
practice_car.c practice_van.c practice_dog.c


3

重命名文件 mv

 mv old_name new_name

使用mv命令可将文件名从old_name更改为new_name

1

在当前目录中重命名文件扩展名的另一种方法,例如将所有.txt文件重命名为.csv

for file in $(ls .); do
    mv $file ${file/.txt/.csv}
done

这不会影响没有 .txt 扩展名的文件,并且它会提示一个错误(根据您的需求应进一步开发)。


0

一些帖子指出了使用for x in $(something); do..的用法

请不要(在任何情况下)使用它!(见下文)

假设你有一个文件(以及其他 .txt 文件):

"my file with a very long file - name-.txt"

如果你执行类似于for f in $(ls *.txt); do echo $f; done这样的命令,它会输出一些内容。
.
..
a.sh
docs
my
file
with
a
very
long
file
-
name-.txt

(或类似的内容)

相反,尝试以下方法:


#! /bin/sh

if [ $# -eq 0 ]; then
    echo -n "example usage: bash $0 .txt .csv <DIR>"
    echo -n "(renames all files(ending with .txt to .csv) in DIR"
    exit
fi

A="$1"      # OLD PREFIX (e.g .txt )
B="$2"      # NEW PREFIX (e.g .csv )
DIR="$3*$A" # DIR     (e.g ./   )

# for file f;
# in path  $DIR;
for f in $DIR; do
  ## do the following:
  # || here just means:
  #         only continue IFF(if and only if)
  #         the previous is-file-check's exit-status returns non-zero
  [ -e "$f" ] || continue
  
  # move file "$f" and rename it's ending $A with $B (e.g ".txt" to ".csv")
  # (still, in $DIR)
  mv "$f" "${f/$A/$B}"
done

###    $ tree docs/

#    docs/
#    ├── a.txt
#    ├── b.txt
#    ├── c.txt
#    └── d.txt
#
#    0 directories, 4 files
#


###   $ bash try3.sh .txt .csv docs/


#    $ tree docs/
#    docs/
#    ├── a.csv
#    ├── b.csv
#    ├── c.csv
#    └── d.csv
#
#    0 directories, 4 files
##
#-------------------#

参考资料:

 MAN's: ($ man  "- the following")
- bash
- mv
- ls

注意:我并不是有意冒犯 - 请不要把它当成冒犯(实际上我从meniluca那里得到了主要命令思路!)

但由于它是(for x in $(ls ..)),所以我决定创建整个脚本,而不仅仅是编辑。


如果有需要改进的地方,请随时指出! - joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接