根据第二个文件的部分名称批量重命名文件
Batch Rename a file based of part of name of second file
我想根据其他文件的部分名称批量重命名一些文件
让我用一个例子来解释我的问题,我认为这样更好
我在 文件夹
中有 一些具有这些名称的文件
sc_gen_08-bigfile4-0-data.txt
signal_1_1-bigfile8.1-0-data.txt
这些文件位于其他文件夹
sc_gen_08-acaaf2d4180b743b7b642e8c875a9765-1-data.txt
signal_1_1-dacaaf280b743b7b642e8c875a9765-4-data.txt
我想批量重命名 first 个文件为 second 个文件的名称,我该怎么做?第一个和第二个文件夹中的文件也有相同的名称
name(common in file in both folder)-[only this part is diffrent in each file]-data.txt
谢谢(很抱歉,如果这对每个人来说不是一个好问题,但对我来说是一个问题)
我们将原始文件夹命名为“folder1”,将另一个文件夹命名为“folder2”。那么请您尝试以下操作:
#!/bin/bash
folder1="folder1" # the original folder name
folder2="folder2" # the other folder name
declare -A map # create an associative array
for f in "$folder2"/*-data.txt; do # find files in the "other folder"
f=${f##*/} # remove directory name
common=${f%%-*} # extract the common substring
map[$common]=$f # associate common name with full filename
done
for f in "$folder1"/*-data.txt; do # find files in the original folder
f=${f##*/} # remove directory name
common=${f%%-*} # extract the common substring
mv -- "$folder1/$f" "$folder1/${map[$common]}"
# rename the file based on the value in map
done
如果你的文件都像你提到的那样调用。我已经创建了下一个脚本。
它位于下一个结构之后。
root@vm:~/test# ll
folder1/
folder2/
script.sh
脚本是下一个:
#Declare folders
folder1=./folder1
folder2=./folder2
#Create new folder if it does not exist
if [ ! -d ./new ]; then
mkdir ./new;
fi
#Iterate over first directory
for file1 in folder1/*; do
#Iterate over second directory
for file2 in folder2/*; do
#Compare begining of each file, if they match, they will be copied.
if [[ $(basename $file1 | cut -f1 -d-) == $(basename $file2 | cut -f1 -d-) ]]; then
echo $(basename $file1) $(basename $file2) "Match"
cp folder1/$(basename $file1) new/$(basename $file2)
fi
done
done
它会创建一个名为 new 的文件夹,并将您的所有文件复制到那里。如果要删除它们,请改用 mv。但是我不想在第一次尝试时使用 mv 以防万一得到一些不希望的效果。
我想根据其他文件的部分名称批量重命名一些文件
让我用一个例子来解释我的问题,我认为这样更好
我在 文件夹
sc_gen_08-bigfile4-0-data.txt
signal_1_1-bigfile8.1-0-data.txt
这些文件位于其他文件夹
sc_gen_08-acaaf2d4180b743b7b642e8c875a9765-1-data.txt
signal_1_1-dacaaf280b743b7b642e8c875a9765-4-data.txt
我想批量重命名 first 个文件为 second 个文件的名称,我该怎么做?第一个和第二个文件夹中的文件也有相同的名称
name(common in file in both folder)-[only this part is diffrent in each file]-data.txt
谢谢(很抱歉,如果这对每个人来说不是一个好问题,但对我来说是一个问题)
我们将原始文件夹命名为“folder1”,将另一个文件夹命名为“folder2”。那么请您尝试以下操作:
#!/bin/bash
folder1="folder1" # the original folder name
folder2="folder2" # the other folder name
declare -A map # create an associative array
for f in "$folder2"/*-data.txt; do # find files in the "other folder"
f=${f##*/} # remove directory name
common=${f%%-*} # extract the common substring
map[$common]=$f # associate common name with full filename
done
for f in "$folder1"/*-data.txt; do # find files in the original folder
f=${f##*/} # remove directory name
common=${f%%-*} # extract the common substring
mv -- "$folder1/$f" "$folder1/${map[$common]}"
# rename the file based on the value in map
done
如果你的文件都像你提到的那样调用。我已经创建了下一个脚本。
它位于下一个结构之后。
root@vm:~/test# ll
folder1/
folder2/
script.sh
脚本是下一个:
#Declare folders
folder1=./folder1
folder2=./folder2
#Create new folder if it does not exist
if [ ! -d ./new ]; then
mkdir ./new;
fi
#Iterate over first directory
for file1 in folder1/*; do
#Iterate over second directory
for file2 in folder2/*; do
#Compare begining of each file, if they match, they will be copied.
if [[ $(basename $file1 | cut -f1 -d-) == $(basename $file2 | cut -f1 -d-) ]]; then
echo $(basename $file1) $(basename $file2) "Match"
cp folder1/$(basename $file1) new/$(basename $file2)
fi
done
done
它会创建一个名为 new 的文件夹,并将您的所有文件复制到那里。如果要删除它们,请改用 mv。但是我不想在第一次尝试时使用 mv 以防万一得到一些不希望的效果。