6 votes

défi du script bash

Je dois écrire un bash script qui va itérer à travers le contenu d'un répertoire (y compris les sous-répertoires) et effectuer les remplacements suivants :

  • remplacer 'foo' par 'bar' dans tous les noms de fichiers
  • remplacer 'foo' dans le contenu de n'importe quel fichier par 'bar'.

Pour l'instant, tout ce que j'ai, c'est

find . -name '*' -exec {} \;

:-)

2voto

Avec RH rename :

find -f \( -exec sed -i s/foo/bar/g \; , -name \*foo\* -exec rename foo bar {} \; \)

2voto

ephemient Points 87003
find "$@" -depth -exec sed -i -e s/foo/bar/g {} \; , -name '*foo*' -print0 |
while read -d '' file; do
    base=$(basename "$file")
    mv "$file" "$(dirname "$file")/${base//foo/bar}"
done

1voto

AJ. Points 12912

MISE À JOUR : 1632 EST

  • Il gère maintenant les espaces mais le "while read item" ne se termine jamais. C'est mieux, mais toujours pas correct. Je vais continuer travailler sur ce sujet.

aj@mmdev0:~/foo_to_bar$ cat script.sh

#!/bin/bash

dirty=true
while ${dirty}
do
    find ./ -name "*" |sed -s 's/ /\ /g'|while read item
    do
        if [[ ${item} == "./script.sh" ]]
        then
            continue
        fi
        echo "working on: ${item}"

        if [[ ${item} == *foo* ]]
        then
            rename 's/foo/bar/' "${item}"
            dirty=true
            break
        fi

        if [[ ! -d ${item} ]]
        then
            cat "${item}" |sed -e 's/foo/bar/g' > "${item}".sed; mv "${item}".sed "${item}"
        fi
        dirty=false
    done
done

1voto

Anibal Perez Points 11
#!/bin/bash
function RecurseDirs
{
oldIFS=$IFS
IFS=$'\n'
for f in *
do
  if [[ -f "${f}" ]]; then
    newf=`echo "${f}" | sed -e 's/foo/bar/g'`
    sed -e 's/foo/bar/g' < "${f}" > "${newf}"
  fi
  if [[ -d "${f}" && "${f}" != '.' && "${f}" != '..' && ! -L "${f}" ]]; then
    cd "${f}"
    RecurseDirs .
    cd ..
  fi
done
IFS=$oldIFS
}
RecurseDirs .

0voto

ghostdog74 Points 86060

Bash 4.0

#!/bin/bash
shopt -s globstar
path="/path"
cd $path
for file in **
do
    if [ -d "$file" ] && [[ "$file" =~ ".*foo.*" ]];then
        echo mv "$file" "${file//foo/bar}"
    elif [ -f "$file" ];then
        while read -r line
        do
            case "$line" in
                *foo*) line="${line//foo/bar}";;
            esac
            echo "$line"
        done < "$file"  > temp
        echo mv temp "$file"

    fi
done

supprimer le 'echo' pour valider les changements

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X