83 votes

Comment diviser le chemin par la dernière barre oblique ?

J'ai un fichier (disons appelé list.txt ) qui contient les chemins d'accès relatifs aux fichiers, un chemin par ligne, c'est-à-dire quelque chose comme ceci :

foo/bar/file1
foo/bar/baz/file2
goo/file3

Je dois écrire un script bash script qui traite un chemin à la fois, le divise au niveau du dernier slash et lance ensuite un autre processus en lui fournissant les deux morceaux du chemin en tant qu'arguments. Pour l'instant, je n'ai que la partie boucle :

for p in `cat list.txt`
do
   # split $p like "foo/bar/file1" into "foo/bar/" as part1 and "file1" as part2
   inner_process.sh $part1 $part2
done

Comment diviser ? Cela fonctionnera-t-il dans le cas dégénéré où le chemin n'a pas de barres obliques ?

169voto

piokuc Points 11938

Utilisation basename y dirname c'est tout ce dont vous avez besoin.

part1=$(dirname "$p")
part2=$(basename "$p")

18voto

gniourf_gniourf Points 9393

Une méthode 100% bash et sûre pour les noms de fichiers contenant des espaces ou des symboles bizarres (à condition que inner_process.sh les traite correctement, mais c'est une autre histoire) :

while read -r p; do
    [[ "$p" == */* ]] || p="./$p"
    inner_process.sh "${p%/*}" "${p##*/}"
done < list.txt

et il ne bifurque pas dirname y basename (dans des sous-shells) pour chaque fichier.

La ligne [[ "$p" == */* ]] || p="./$p" est ici au cas où $p ne contient pas de barre oblique, alors il ajoute en préambule ./ à elle.

Voir le Expansion des paramètres de la coquille dans la section Manuel de référence Bash pour plus d'informations sur la % y ## symboles.

9voto

Phil Roggenbuck Points 574

J'ai trouvé une excellente solution en lisant ce qui suit source .

p=/foo/bar/file1
path=$( echo ${p%/*} )
file=$( echo ${p##*/} )

Cela fonctionne également avec des espaces dans le chemin d'accès !

-2voto

Voici un exemple de recherche et de remplacement d'extensions de fichiers en xml.

for files in $(ls); do

    filelist=$(echo $files |cut -f 1 -d ".");
    mv $files $filelist.xml;
done

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