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

ne pas copier certains fichiers ??

6 réponses
Avatar
JClaude
Bonjour !

Sous AIX v5.1 avec ksh

Je voudrais pourvoir copier tous les fichiers d'un répertoire sauf ceux qui
commence par les deux lettre HF ???

Quelqu'un peut'il me renseigner ??

Merci

6 réponses

Avatar
Rakotomandimby (R12y)
Je voudrais pourvoir copier tous les fichiers d'un répertoire sauf ceux qui
commence par les deux lettre HF ???


Stéphane t'as déjà donné une piste.

Quelqu'un peut'il me renseigner ??


Renseigner ou aider à faire les devoirs?

Avatar
Dam
avec un script shell non?

du style :

files=$("find . -type f -exec grep -v "^HF" {};")
for file in ($files)
do
mv $file <rep_cible>
done

En gros... j'ai pas de moyen de vérifier là ;)



Bonjour !

Sous AIX v5.1 avec ksh

Je voudrais pourvoir copier tous les fichiers d'un répertoire sauf ceux qui
commence par les deux lettre HF ???

Quelqu'un peut'il me renseigner ??

Merci


Avatar
Stephane Chazelas
2006-11-10, 05:11(-08), Dam:

avec un script shell non?

du style :

files=$("find . -type f -exec grep -v "^HF" {};")
for file in ($files)
do
mv $file <rep_cible>
done

En gros... j'ai pas de moyen de vérifier là ;)
[...] [Merci de poster a l'endroit]


Ouch! En tres gros alors :). Je ne crois pas que la commande
"find . -type f -exec grep -v "^HF" {};" existe. Ce n'est pas
la syntaxe correcte pour for. grep match sur son entree
standard ou sur le contenu des fichiers passés en arguments, pas
sur la valeur de ses arguments. Les variables, quand referencee
en contexte de liste doivent etre quotees. find va operer
recursivement.

La syntaxe !(pattern) avait deja ete donnee a l'OP:

mv -- !(HF*) <rep-cible>
(syntaxe ksh, ou zsh -o kshglob or bash avec option extglob)

On aurait pu utiliser find:

find . ! -name . -prune ! -type d ! -name 'HF*'
-exec mv {} <rep-cible> ;

--
Stéphane

Avatar
Dam
Oui effectivement en tres gros. Je n'ai pas de Linux à la maison qui
m'aurait permis de vérifier...

sinon
find . ! -name . -prune ! -type d ! -name 'HF*' -exec mv {}
<rep-cible> ;
n'est pas plus simple en
find . -type f ! -name 'HF*' -exec mv {} <rep-cible> ;
?

Sinon sans find ça doit etre possible aussi:
files=`ls . | grep -v '^HF'`
for file in $files
do
mv $file <rep_cible>
done
(faut le voir en tant qu'algorithme car c'est surement exactement comme
ça)

Question ++ : il est où le pb avec mon for?


2006-11-10, 05:11(-08), Dam:

avec un script shell non?

du style :

files=$("find . -type f -exec grep -v "^HF" {};")
for file in ($files)
do
mv $file <rep_cible>
done

En gros... j'ai pas de moyen de vérifier là ;)
[...] [Merci de poster a l'endroit]


Ouch! En tres gros alors :). Je ne crois pas que la commande
"find . -type f -exec grep -v "^HF" {};" existe. Ce n'est pas
la syntaxe correcte pour for. grep match sur son entree
standard ou sur le contenu des fichiers passés en arguments, pas
sur la valeur de ses arguments. Les variables, quand referencee
en contexte de liste doivent etre quotees. find va operer
recursivement.

La syntaxe !(pattern) avait deja ete donnee a l'OP:

mv -- !(HF*) <rep-cible>
(syntaxe ksh, ou zsh -o kshglob or bash avec option extglob)

On aurait pu utiliser find:

find . ! -name . -prune ! -type d ! -name 'HF*'
-exec mv {} <rep-cible> ;

--
Stéphane



Avatar
Stephane Chazelas
2006-11-10, 11:30(-08), Dam:
Oui effectivement en tres gros. Je n'ai pas de Linux à la maison qui
m'aurait permis de vérifier...

sinon
find . ! -name . -prune ! -type d ! -name 'HF*' -exec mv {}
<rep-cible> ;
n'est pas plus simple en
find . -type f ! -name 'HF*' -exec mv {} <rep-cible> ;
?


-type f, c'est uniquement pour les fichiers reguliers, ce n'est
pas synonyme de ! -type d.

Sans ! -name . -prune, find va descendre dans les
sous-repertoires.


Sinon sans find ça doit etre possible aussi:
files=`ls . | grep -v '^HF'`
for file in $files


Si tu veux utiliser la fonction de decoupage du shell, alors il
faut specifier le separateur.

IFS='
' # saut de ligne, autrement ca decoupe aussi sur les espaces et
# tabs, mais note que rien n'empeche un nom de fichier de
# contenir un saut de ligne, donc cette methode n'est
# qu'approximative.

et il faut desactiver le globbin

set -f # sans quoi les wildcards sont expandés.

do
mv $file <rep_cible>


Ici, aucune raison de demander du decoupage ou du globbing, donc
$file devrait etre quoté: "$file"

mv -- "$file" <rep_cible>

done
(faut le voir en tant qu'algorithme car c'est surement exactement comme
ça)

Question ++ : il est où le pb avec mon for?


[...]
for file in ($files)




IFS=<separator>; set -f
for file in $files

# pas de parentheses.

Tu confonds peut-etre avec la syntaxe abregee de zsh:

for file ($=files) cmd -- $file

--
Stéphane



Avatar
Dam
OK nickel.

Merci ;)



2006-11-10, 11:30(-08), Dam:
Oui effectivement en tres gros. Je n'ai pas de Linux à la maison qui
m'aurait permis de vérifier...

sinon
find . ! -name . -prune ! -type d ! -name 'HF*' -exec mv {}
<rep-cible> ;
n'est pas plus simple en
find . -type f ! -name 'HF*' -exec mv {} <rep-cible> ;
?


-type f, c'est uniquement pour les fichiers reguliers, ce n'est
pas synonyme de ! -type d.

Sans ! -name . -prune, find va descendre dans les
sous-repertoires.


Sinon sans find ça doit etre possible aussi:
files=`ls . | grep -v '^HF'`
for file in $files


Si tu veux utiliser la fonction de decoupage du shell, alors il
faut specifier le separateur.

IFS='
' # saut de ligne, autrement ca decoupe aussi sur les espaces et
# tabs, mais note que rien n'empeche un nom de fichier de
# contenir un saut de ligne, donc cette methode n'est
# qu'approximative.

et il faut desactiver le globbin

set -f # sans quoi les wildcards sont expandés.

do
mv $file <rep_cible>


Ici, aucune raison de demander du decoupage ou du globbing, donc
$file devrait etre quoté: "$file"

mv -- "$file" <rep_cible>

done
(faut le voir en tant qu'algorithme car c'est surement exactement comme
ça)

Question ++ : il est où le pb avec mon for?


[...]
for file in ($files)




IFS=<separator>; set -f
for file in $files

# pas de parentheses.

Tu confonds peut-etre avec la syntaxe abregee de zsh:

for file ($=files) cmd -- $file

--
Stéphane