创建并重命名多个文件副本

时间:2014-04-21 10:31:10

标签: bash awk

我有一个文件input.txt,如下所示。

abas_1.txt
abas_2.txt
abas_3.txt
1fgh.txt
3ghl_1.txt
3ghl_2.txt 

我有一个文件夹ff。此文件夹的文件名为abas.txt1fgh.txt3ghl.txt。基于输入文件,我想在ff文件夹中创建并重命名多个副本。

例如,在输入文件中,abas有三个副本。在ff文件夹中,我需要创建abas.txt的三个副本,并将其重命名为abas_1.txtabas_2.txtabas_3.txt。无需在ff文件夹中复制和重命名1fgh.txt

您的宝贵建议将不胜感激。

4 个答案:

答案 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)

使用forgrep

#!/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