我试图在我的Linux系统上更改多个文件的名称。 我使用了rename 's/foo/bar/g' *
所有我想要更改名称的文件都在当前目录中。
它没有更改文件的名称,但我认为它应该。 如有帮助,将不胜感激。
一个简单的方法是:
mv file2rename newname
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
重命名文件 mv
mv old_name new_name
old_name
更改为new_name
。在当前目录中重命名文件扩展名的另一种方法,例如将所有.txt
文件重命名为.csv
:
for file in $(ls .); do
mv $file ${file/.txt/.csv}
done
这不会影响没有 .txt
扩展名的文件,并且它会提示一个错误(根据您的需求应进一步开发)。
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
但由于它是(for x in $(ls ..)),所以我决定创建整个脚本,而不仅仅是编辑。
rename foo bar *
命令,或者阅读manpage。 - hasufell