Найти и заменить строку в пакете файлов, но не создавать конфликтов имен

На машине с GNU Coreutils (большинство дистрибутивов Linux) команда cp имеет -x.

Из man-страницы cp:

-x, --one-file-system
0
25.02.2018, 01:52
2 ответа

He aquí una estructura básica. Si algo sale mal, MAXTRYS detiene el cambio de nombre. Elija un valor razonable.

#!/bin/bash
#
# Usage: 
#       numberedMove xy-file.txt TARGETDIR 
#
file="$1"
targetDir="$2"
MAXTRYS=666
#
# @TODO
# add tests for permissions, maybe handle symlinks etc.
#
test -f "$file" || {
    echo No such file "$file" or not an ordinary file
    exit 1;
}

test -d "$targetDir" || {
    echo No such directory "$targetDir"
    exit 2;
}

#
# append NUM+1 to filename, to create unique name
#
numbered () {
  fname="$1"
  num=$2
  if [[ $num -gt $MAXTRYS ]]
  then
    echo " giving up - max trys: $MAXTRYS "
    exit 3
  fi
  # echo "mv $fname → $targetDir/$fname$num"
  test -f "$targetDir/$fname$num" && numbered "$fname" $((num+1)) || mv "$file" "$targetDir/$fname$num"
}

#
# remove all SOMENAME and replace every blank with a dot
#
filtername () {
   fname="$1"
   fname=${fname//SOMENAME/}
   fname=${fname// /.}
   echo "$fname"
}
#
# filter filename, if unique: move, else move with number suffix
#
if [[ -e "$file" ]]
then
    newname=$(filtername "$file")
    if [[ ! -f "$targetDir/$newname" ]]
    then
        # echo "mv $file → $targetDir/$newname"
        mv "$file" "$targetDir/$newname"
    else
        # echo "mv $file → $targetDir/$newname NUMBERED"
        numbered "$newname" 1
    fi
fi

En filternamepuede agregar más reglas y cambiar las existentes.

Si esto fuera para mis propias necesidades, reemplazaría los espacios en blanco con ' -', no con '.', ya que el punto es un indicador bastante débil (a.tar.bz2 )para significado.

Y colapsaría el delimitador múltiple a uno, así que en lugar de:

    mv "ab cd - SOMENAME..mp3" → "./B/ab.cd.-...mp3" 
    mv "ab cd - SOMENAME..mp3" → "./B/ab-cd-.mp3" 

Y mantendría la extensión del archivo y pondría el número delante de la última extensión:

    mv "ab cd- SOMENAME..mp3"  → "./B/ab-cd-0.mp3" 
    mv "ab cd - SOMENAME..mp3" → "./B/ab-cd-1.mp3" 
    mv "ab cd -SOMENAME..mp3"  → "./B/ab-cd-2.mp3" 

ya que muchos programas interpretan la extensión.

Solo probé el programa con unos 10 archivos, así que haga una copia de seguridad antes de usar y verifique, tal vez por el tamaño total del archivo y el número de archivos, si la operación tuvo éxito.

Mis pruebas:

for f in a* ; do./numberedMove.sh "$f"./B ; done

Tenga en cuenta que al colocar el programa en el CWD, es posible que se mueva.

0
28.01.2020, 04:30
find. -maxdepth 1 -type f > orginal_file

find. -maxdepth 1 -type f -exec sed -r "s/\s+//g"| sed "s/SOMENAME//g" >> /var/tmp/modified file

paste orginal_file /var/tmp/modified file >> combined_orginal_modified_column_wise

for i in `cat /var/tmp/modified file`
do
if [[ -f $i ]]
then
echo "file exsist"
else
awk -v i="$i" '/i/{print "mv" " " $1 " " $2}'   combined_orginal_modified_column_wise
fi
done

for i in `cat /var/tmp/modified file`
do
if [[ -f $i ]]
then
for j in {1..10}
do
elif [[ -f $i$j ]]
then
echo "$i$j exsists"
fi
done
else
awk -v i="$i" -v j="$j" '{print "mv" " " $1 " " ij}'  combined_orginal_modified_column_wise
fi


done
0
28.01.2020, 04:30

Теги

Похожие вопросы