Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[bash] lister/copier le contenu situé à la racine d'un dossier sans rien oublier ( comme les dot-files et les « space-files »)

38 réponses
Avatar
Francois Lafont
Bonjour à tous,

J'ai deux soucis. Dans les deux cas, je précise une fois pour toutes que
je souhaite obtenir des solutions qui gèrent correctement les noms de
fichiers avec des espaces (au début et/ou au milieu et/ou à la fin)
ainsi que les fichiers avec un nom de la forme .xxx (ie un dot-file).



1) Je souhaite lister le contenu situé à la racine d'un dossier
/dossier, c'est-à-dire tous les noms des fichiers-dossiers se trouvant à
la racine de /dossier. Alors, je pense naturellement à :

#-------------------------------------
for i in $(ls -A "/dossier"); do
echo "--$i--"
done
#-------------------------------------

Je « chope » bien les dot-files, mais ça coince avec des
fichiers-dossiers dont le nom contient des espaces. C'est un problème
simple mais pourtant je n'ai pas trouvé mieux que ça pour le résoudre :

#-------------------------------------
find "/dossier" -maxdepth 1 -mindepth 1 | while read; do
nom=$(basename "$REPLY")
echo "--$nom--"
done
#-------------------------------------

Y a-t-il plus simple que ça ? (J'espère que oui quand même).



2) Je souhaite copier tout le contenu du dossier /source vers le dossier
/cible.

« cp -r /source /cible » ne marche pas car il copie le dossier "source"
dans le dossier "cible" alors que je veux copier le contenu de "source".
« cp -r /source/* /cible » ne copie pas les dot-files. Si je fais alors
« cp -r /source/.* /cible », pour des raisons que je ne comprends pas
très bien d'ailleurs (si vous avez une explication au passage ça
m'intéresse), il y a tentative de copie de ce qui se trouve « au dessus
» de /source. Là aussi, pour un problème assez simple en somme, je n'ai
pas trouvé mieux que ça :

#-------------------------------------
find "/source" -maxdepth 1 -mindepth 1 | while read; do
cp -r "$REPLY" "/cible"
done
#-------------------------------------

Y a-t-il plus simple que ça également ?



--
François Lafont

10 réponses

1 2 3 4
Avatar
Nicolas George
YBM , dans le message <4f4e4cf0$0$31965$, a
écrit :
Il y a quand même bien plus simple...



Oui, tu l'as déjà dit. Tu as eu raison. Mais...

:/tmp/a$ cp -a source/. cible/



Il n'y a pas que cp, dans la vie. Comprendre ce qui se passe et savoir
faire pour quand on ne trouve pas d'astuce pour couper court est important.
Avatar
Nicolas George
Francois Lafont , dans le message
<4f4e5402$0$6527$, a écrit :
En revanche, je ne comprends pas pourquoi la présence de ce fichu point
change tout le comportement de la commande cp ? Car au final /soure/ ou
source/. c'est la même chose non ? J'ai beau regarder la page man de cp,
je ne vois pas d'explication là-dessus.



cp -r copie le répertoire source en bloc dans un répertoire de même nom,
qu'il crée si nécessaire. Si tu écris « cp -r /some/path/source », il veut
copier le répertoire qui s'appelle source, si tu écrirs « cp -r
/some/path/source/. », il veut copier le répertoire ., qui s'avère être à la
source être exactement le même que source, et idem à la cible.
Avatar
YBM
Nicolas George a écrit :
YBM , dans le message <4f4e4cf0$0$31965$, a
écrit :
Il y a quand même bien plus simple...



Oui, tu l'as déjà dit. Tu as eu raison. Mais...

:/tmp/a$ cp -a source/. cible/



Il n'y a pas que cp, dans la vie. Comprendre ce qui se passe et savoir
faire pour quand on ne trouve pas d'astuce pour couper court est important.



Certes, d'où l'intérêt de faire partager les conclusions d'expériences
passées.

Ce que j'en ai gardé en tête, pour des situations similaire c'est

cp -a source/. cible/ # si peu de données
(cd source ; tar cf - .) | (cd cible ; tar xf -) # si beaucoup de données

la seconde solution se trouvant terriblement performante.
Avatar
Nicolas George
YBM , dans le message <4f4e5dd1$0$12464$, a
écrit :
Ce que j'en ai gardé en tête, pour des situations similaire c'est
cp -a source/. cible/ # si peu de données
(cd source ; tar cf - .) | (cd cible ; tar xf -) # si beaucoup de données



C'est toujours de la copie.
Avatar
denis.paris
Le 29/02/2012 18:04, Nicolas George a écrit :
Francois Lafont , dans le message
<4f4e5402$0$6527$, a écrit :
En revanche, je ne comprends pas pourquoi la présence de ce fichu point
change tout le comportement de la commande cp ? Car au final /soure/ ou
source/. c'est la même chose non ? J'ai beau regarder la page man de cp,
je ne vois pas d'explication là-dessus.



cp -r copie le répertoire source en bloc dans un répertoire de même nom,
qu'il crée si nécessaire. Si tu écris « cp -r /some/path/source », il veut
copier le répertoire qui s'appelle source, si tu écrirs « cp -r
/some/path/source/. », il veut copier le répertoire ., qui s'avère être à la
source être exactement le même que source, et idem à la cible.



Je n'ai pas compris (peut-être des mots en trop, ou en moins?)
Avatar
YBM
Nicolas George a écrit :
YBM , dans le message <4f4e5dd1$0$12464$, a
écrit :
Ce que j'en ai gardé en tête, pour des situations similaire c'est
cp -a source/. cible/ # si peu de données
(cd source ; tar cf - .) | (cd cible ; tar xf -) # si beaucoup de données



C'est toujours de la copie.



Ben oui... Puisque toute la question est là...
Avatar
Nicolas George
YBM , dans le message <4f4e6387$0$23174$, a
écrit :
Ben oui... Puisque toute la question est là...



Absolument pas, obtenir la liste de tous les fichiers présents dépasse
largement le cadre de la copie.
Avatar
YBM
Nicolas George a écrit :
YBM , dans le message <4f4e6387$0$23174$, a
écrit :
Ben oui... Puisque toute la question est là...



Absolument pas, obtenir la liste de tous les fichiers présents dépasse
largement le cadre de la copie.



Tu confonds les moyens et la fin.
Avatar
Nicolas George
YBM , dans le message <4f4e6828$0$5872$, a écrit :
Tu confonds les moyens et la fin.



Non. Obtenir la liste des fichiers est un moyen, mais qui peut servir pour
différentes fins, qui souvent n'ont pas d'astuce telle que celles que tu as
montrées.

Et accessoirement, cette conversation avec toi commence à me gonfler.
Avatar
YBM
Nicolas George a écrit :
YBM , dans le message <4f4e6828$0$5872$, a écrit :
Tu confonds les moyens et la fin.



Non. Obtenir la liste des fichiers est un moyen, mais qui peut servir pour
différentes fins, qui souvent n'ont pas d'astuce telle que celles que tu as
montrées.

Et accessoirement, cette conversation avec toi commence à me gonfler.



Tu es bien gentil mais dans ce cas il ne fallait pas commencer à me
chercher.

Je me suis contenté de répondre à une question précise par une réponse
précise, point-barre, pas de quoi me chercher des poux dans la tête.
1 2 3 4