Bash: 查找特定文件并从名称中删除最后 5 个字符
Bash: Find specific files and cut last 5 characters from name
我的 ./
文件夹下有一些文件,例如:
$ ls
XX
AArse
BArse
CCCAArse
YY
....
在一些命令之后我想要:
AA
BA
CCCAA
即如果文件名末尾包含 rse
,文件将被重命名(从名称中删除 rse
)。
如何在 bash 中实现 某些命令?
使用 Perl 的独立 rename
命令、正则表达式和 bash 的通配:
rename -n 's/...$//' *rse
在某些发行版中 rename
也称为 prename
。如果一切正常,请删除 -n
.
与bash
:
shopt -s nullglob
for file in *rse; do
mv -i "$file" "${file%rse}"
done
shell 选项 nullglob
将不匹配的 glob 模式扩展为空字符串,参数扩展 ${file%rse}
从文件名中删除最短的后缀 rse
。
选项-i
提示覆盖已有文件。
给出一个更通用的答案:
finder.sh:
#!/usr/bin/env bash
usage() {
echo 'Usage: ./finder.sh string_to_remove'
exit
}
if [ "$#" -ne 1 ]; then
usage
fi
check_string=
counter=0
for file in ./*
do
if [[ -f $file ]]; then
if [[ $file == *"$check_string"* ]]; then
mv -v "$file" `echo $file | sed "s/$check_string//"`
let "counter++"
fi
fi
done
if [ ! "$counter" -gt 0 ]; then
echo "No files found containing '$check_string'"
else
echo "$counter files effected with string '$check_string'"
fi
然后您可以通过以下方式将其与不同的子字符串一起使用(在执行 chmod +x finder.sh
之后):
./finder.sh any_string
# Removes 'any_string' from all filenames
示例:
目录列表如下:
$ ls
AArse
AByfl
BArse
CCCAArse
XX
YY
你可以运行
./finder.sh rse; ./finder.sh yfl
得到以下输出:
renamed './AArse' -> './AA'
renamed './BArse' -> './BA'
renamed './CCCAArse' -> './CCCAA'
3 files effected with string 'rse'
renamed './AByfl' -> './AB'
1 files effected with string 'yfl'
这样您的目录现在看起来像:
AA
AB
BA
CCCAA
XX
YY
当然,您可能希望在使用 mv
命令时内置一些潜在覆盖检查。
我的 ./
文件夹下有一些文件,例如:
$ ls
XX
AArse
BArse
CCCAArse
YY
....
在一些命令之后我想要:
AA
BA
CCCAA
即如果文件名末尾包含 rse
,文件将被重命名(从名称中删除 rse
)。
如何在 bash 中实现 某些命令?
使用 Perl 的独立 rename
命令、正则表达式和 bash 的通配:
rename -n 's/...$//' *rse
在某些发行版中 rename
也称为 prename
。如果一切正常,请删除 -n
.
与bash
:
shopt -s nullglob
for file in *rse; do
mv -i "$file" "${file%rse}"
done
shell 选项 nullglob
将不匹配的 glob 模式扩展为空字符串,参数扩展 ${file%rse}
从文件名中删除最短的后缀 rse
。
选项-i
提示覆盖已有文件。
给出一个更通用的答案:
finder.sh:
#!/usr/bin/env bash
usage() {
echo 'Usage: ./finder.sh string_to_remove'
exit
}
if [ "$#" -ne 1 ]; then
usage
fi
check_string=
counter=0
for file in ./*
do
if [[ -f $file ]]; then
if [[ $file == *"$check_string"* ]]; then
mv -v "$file" `echo $file | sed "s/$check_string//"`
let "counter++"
fi
fi
done
if [ ! "$counter" -gt 0 ]; then
echo "No files found containing '$check_string'"
else
echo "$counter files effected with string '$check_string'"
fi
然后您可以通过以下方式将其与不同的子字符串一起使用(在执行 chmod +x finder.sh
之后):
./finder.sh any_string
# Removes 'any_string' from all filenames
示例:
目录列表如下:
$ ls
AArse
AByfl
BArse
CCCAArse
XX
YY
你可以运行
./finder.sh rse; ./finder.sh yfl
得到以下输出:
renamed './AArse' -> './AA'
renamed './BArse' -> './BA'
renamed './CCCAArse' -> './CCCAA'
3 files effected with string 'rse'
renamed './AByfl' -> './AB'
1 files effected with string 'yfl'
这样您的目录现在看起来像:
AA
AB
BA
CCCAA
XX
YY
当然,您可能希望在使用 mv
命令时内置一些潜在覆盖检查。