Bash 将子文件夹中的多个文件重命名为它们的文件夹名称的脚本
Bash script to Rename multiple files in subfolder to their folder name
我有以下文件结构:
Applications/Snowflake/applications/Salford_100/wrongname_120.nui; wrongname_200_d.nui
Applications/Snowflake/applications/Salford_900/wrongname_120.nui; wrongname_200_d.nui
Applications/Snowflake/applications/Salford_122/wrongname_120.nui; wrongname_200_d.nui
并且我想将文件重命名为与它们所在目录相同的名称,但末尾带有“_d”的文件应保留其最后 2 个字符。文件模式始终为 "salford_xxx",其中 xxx 始终为 3 位数字。因此生成的文件将是:
Applications/Snowflake/applications/Salford_100/Salford_100.nui; Salford_100_d.nui
Applications/Snowflake/applications/Salford_900/Salford_900.nui; Salford_900_d.nui
Applications/Snowflake/applications/Salford_122/Salford_122.nui; Salford_122_d.nui
脚本将 运行 来自
中的不同位置
Applications/Snowflake/Table-updater
我想这需要一个 for 循环和一个 sed 正则表达式,但我愿意接受任何建议。
(感谢@ghoti 的建议)
我试过这个,目前还没有考虑带有“_d”的文件,我只是正确重命名了一个文件。一些帮助将不胜感激。
cd /Applications/snowflake/table-updater/Testing/applications/salford_*
dcomp="$(basename "$(pwd)")"
for file in *; do
ext="${file##*.}"
mv -v "$file" "$dcomp.$ext"
done
我现在已经按照@va运行 的建议(谢谢)更新了脚本,它现在还搜索父目录中名称中包含 salford 的所有文件,但遗漏了父名称。请看下面
#!/bin/sh
#
# RenameToDirName2.sh
#
set -e
cd /Applications/snowflake/table-updater/Testing/Applications/
find salford* -maxdepth 1 -type d \( ! -name . \) -exec sh -c '(cd {} &&
(
dcomp="$(basename "$(pwd)")"
for file in *;
do ext="${file#*.}"
zz=$(echo $file|grep _d)
if [ -z $zz ]
then
mv -v "$file" "$dcomp.$ext"
else
mv -v "$file" "${dcomp}_d.$ext"
fi
done
)
)' ';'
事实是,我刚刚意识到在这些 salford 子目录中还有其他我不想重命名的具有不同扩展名的文件。我尝试放入一个 else if 语句来仅规定 *.Nui 文件,调用我的 $dcomp 变量,就像这样
else
if file in $dcomp/*.nui
then
#continue...
但我收到错误。这应该放在我的脚本中的什么位置,我是否有这个循环的正确语法?你能帮忙吗?
你可以这样写:
(
cd ../applications/ && \
for name in Salford_[0-9][0-9][0-9] ; do
mv "$name"/*_[0-9][0-9][0-9].nui "$name/$name.nui"
mv "$name"/*_[0-9][0-9][0-9]_d.nui "$name/${name}_d.nui"
done
)
(注意:(...)
是一个子 shell,用于限制 directory-change 和 name
变量的范围。)
@eggfoot,我已经修改了我的脚本,它将查看文件夹应用程序中的所有目录并查找其中包含 Salford 的文件夹。
所以你可以这样调用我的脚本
./rename.sh /home/username/Applications/Snowflake e/applications
#!/bin/bash
# set -x
path=
dir_list=$(find $path/ -type d)
for index_dir in $dir_list
do
aa=$(echo $index_dir|grep Salford)
if [ ! -z $aa ]
then
files_list=$(find $index_dir/ -type f)
for index in $files_list
do
xx=$(basename $index)
z=$(echo $xx|grep '_d')
if [ -z $z ]
then
result=$(echo $index | sed 's/\/\(.*\)\/\(.*\)\/\(.*\)\(\..*$\)/\/\/\//')
mv "$index" "$result"
else
result=$(echo $index | sed 's/\/\(.*\)\/\(.*\)\/\(.*\)_d\(\..*$\)/\/\/\/_d/')
mv "$index" "$result"
fi
done
fi
done
关于sed,使用sed的s命令,将文件名替换为目录名,扩展名不变
关于您的脚本,您需要使用 grep 命令查找包含 _d 的文件,然后您可以使用参数替换更改包含 _d 和不包含 _d 的文件的 mv。
dcomp="$(basename "$(pwd)")"
for file in *; do
ext="${file##*.}"
zz=$(echo $file|grep _d)
if [ -z $zz ]
then
mv -v "$file" "$dcomp.$ext"
else
mv -v "$file" "${dcomp}_d.$ext"
fi
done
我有以下文件结构:
Applications/Snowflake/applications/Salford_100/wrongname_120.nui; wrongname_200_d.nui
Applications/Snowflake/applications/Salford_900/wrongname_120.nui; wrongname_200_d.nui
Applications/Snowflake/applications/Salford_122/wrongname_120.nui; wrongname_200_d.nui
并且我想将文件重命名为与它们所在目录相同的名称,但末尾带有“_d”的文件应保留其最后 2 个字符。文件模式始终为 "salford_xxx",其中 xxx 始终为 3 位数字。因此生成的文件将是:
Applications/Snowflake/applications/Salford_100/Salford_100.nui; Salford_100_d.nui
Applications/Snowflake/applications/Salford_900/Salford_900.nui; Salford_900_d.nui
Applications/Snowflake/applications/Salford_122/Salford_122.nui; Salford_122_d.nui
脚本将 运行 来自
中的不同位置Applications/Snowflake/Table-updater
我想这需要一个 for 循环和一个 sed 正则表达式,但我愿意接受任何建议。 (感谢@ghoti 的建议) 我试过这个,目前还没有考虑带有“_d”的文件,我只是正确重命名了一个文件。一些帮助将不胜感激。
cd /Applications/snowflake/table-updater/Testing/applications/salford_*
dcomp="$(basename "$(pwd)")"
for file in *; do
ext="${file##*.}"
mv -v "$file" "$dcomp.$ext"
done
我现在已经按照@va运行 的建议(谢谢)更新了脚本,它现在还搜索父目录中名称中包含 salford 的所有文件,但遗漏了父名称。请看下面
#!/bin/sh
#
# RenameToDirName2.sh
#
set -e
cd /Applications/snowflake/table-updater/Testing/Applications/
find salford* -maxdepth 1 -type d \( ! -name . \) -exec sh -c '(cd {} &&
(
dcomp="$(basename "$(pwd)")"
for file in *;
do ext="${file#*.}"
zz=$(echo $file|grep _d)
if [ -z $zz ]
then
mv -v "$file" "$dcomp.$ext"
else
mv -v "$file" "${dcomp}_d.$ext"
fi
done
)
)' ';'
事实是,我刚刚意识到在这些 salford 子目录中还有其他我不想重命名的具有不同扩展名的文件。我尝试放入一个 else if 语句来仅规定 *.Nui 文件,调用我的 $dcomp 变量,就像这样
else
if file in $dcomp/*.nui
then
#continue...
但我收到错误。这应该放在我的脚本中的什么位置,我是否有这个循环的正确语法?你能帮忙吗?
你可以这样写:
(
cd ../applications/ && \
for name in Salford_[0-9][0-9][0-9] ; do
mv "$name"/*_[0-9][0-9][0-9].nui "$name/$name.nui"
mv "$name"/*_[0-9][0-9][0-9]_d.nui "$name/${name}_d.nui"
done
)
(注意:(...)
是一个子 shell,用于限制 directory-change 和 name
变量的范围。)
@eggfoot,我已经修改了我的脚本,它将查看文件夹应用程序中的所有目录并查找其中包含 Salford 的文件夹。 所以你可以这样调用我的脚本
./rename.sh /home/username/Applications/Snowflake e/applications
#!/bin/bash
# set -x
path=
dir_list=$(find $path/ -type d)
for index_dir in $dir_list
do
aa=$(echo $index_dir|grep Salford)
if [ ! -z $aa ]
then
files_list=$(find $index_dir/ -type f)
for index in $files_list
do
xx=$(basename $index)
z=$(echo $xx|grep '_d')
if [ -z $z ]
then
result=$(echo $index | sed 's/\/\(.*\)\/\(.*\)\/\(.*\)\(\..*$\)/\/\/\//')
mv "$index" "$result"
else
result=$(echo $index | sed 's/\/\(.*\)\/\(.*\)\/\(.*\)_d\(\..*$\)/\/\/\/_d/')
mv "$index" "$result"
fi
done
fi
done
关于sed,使用sed的s命令,将文件名替换为目录名,扩展名不变
关于您的脚本,您需要使用 grep 命令查找包含 _d 的文件,然后您可以使用参数替换更改包含 _d 和不包含 _d 的文件的 mv。
dcomp="$(basename "$(pwd)")"
for file in *; do
ext="${file##*.}"
zz=$(echo $file|grep _d)
if [ -z $zz ]
then
mv -v "$file" "$dcomp.$ext"
else
mv -v "$file" "${dcomp}_d.$ext"
fi
done