我有一个文件input.txt
,如下所示。
abas_1.txt
abas_2.txt
abas_3.txt
1fgh.txt
3ghl_1.txt
3ghl_2.txt
我有一个文件夹ff
。此文件夹的文件名为abas.txt
,1fgh.txt
,3ghl.txt
。基于输入文件,我想在ff文件夹中创建并重命名多个副本。
例如,在输入文件中,abas
有三个副本。在ff
文件夹中,我需要创建abas.txt
的三个副本,并将其重命名为abas_1.txt
,abas_2.txt
,abas_3.txt
。无需在ff文件夹中复制和重命名1fgh.txt
。
您的宝贵建议将不胜感激。
答案 0 :(得分:1)
你可以尝试这样的事情(从文件夹ff
中运行):
#!/bin/bash
while IFS= read -r fn; do
[[ $fn =~ ^(.+)_[[:digit:]]+\.([^\.]+)$ ]] || continue
fn_orig=${BASH_REMATCH[1]}.${BASH_REMATCH[2]}
echo cp -nv -- "$fn_orig" "$fn"
done < input.txt
如果您对此感到满意,请移除echo
。
如果您不想在文件夹ff
内运行,只需替换
echo cp -nv -- "$fn_orig" "$fn"
与
echo cp -nv -- "ff/$fn_orig" "ff/$fn"
-n
的{{1}}选项,以便不覆盖现有文件,cp
选项为详细。 -v
告诉--
除此之外没有其他选项,因此如果其中一个文件以连字符开头,则不会混淆。
答案 1 :(得分:0)
使用for
和grep
:
#!/bin/bash
for i in $(ls)
do
x=$(echo $i | sed 's/^\(.*\)\..*/\1/')"_"
for j in $(grep $x in)
do
cp -n $i $j
done
done
答案 2 :(得分:0)
试试这个
#!/bin/bash
while read newFileName;do
#split the string by _ delimiter
arr=(${newFileName//_/ })
extension="${newFileName##*.}"
fileToCopy="${arr[0]}.$extension"
#check for empty : '1fgh.txt' case
if [ -n "${arr[1]}" ]; then
#check if file exists
if [ -f $fileToCopy ];then
echo "copying $fileToCopy -> $newFileName"
cp "$fileToCopy" "$newFileName"
#else
# echo "File $fileToCopy does not exist, so it can't be copied"
fi
fi
done
您可以这样调用您的脚本:
cat input.txt | ./script.sh
答案 3 :(得分:0)
如果您可以更改input.txt
的格式,建议您进行调整以使您的工作更轻松。如果没有,这是我的解决方案:
#!/bin/bash
SRC_DIR=/path/to/ff
INPUT=/path/to/input.txt
BACKUP_DIR=/path/to/backup
for cand in `ls $SRC_DIR`; do
grep "^${cand%.*}_" $INPUT | while read new
do
cp -fv $SRC_DIR/$cand $BACKUP_DIR/$new
done
done