J'essaye d'obtenir le contenu d'un répertoire en utilisant un script shell.
Mon script est:
for entry in `ls $search_dir`; do
echo $entry
done
où $search_dir
est un chemin relatif. Cependant, $search_dir
contient de nombreux fichiers avec des espaces dans leurs noms. Dans ce cas, ce script ne s'exécute pas comme prévu.
Je sais que je pourrais utiliser for entry in *
, mais cela ne fonctionnerait que pour mon répertoire actuel.
Je sais que je peux accéder à ce répertoire, utiliser for entry in *
puis revenir en arrière, mais ma situation particulière m'empêche de le faire.
J'ai deux chemins relatifs $search_dir
et $work_dir
, et je dois travailler sur les deux simultanément, en les lisant, en créant / supprimant des fichiers, etc.
Alors qu'est-ce que je fais maintenant?
PS: j'utilise bash.
bash
shell
directory-listing
jrharshath
la source
la source
for entry in "$search_dir/*"
ne fonctionne pas? Pourquoi devons-nous placer en/*
dehors des citations?find
plus rapide?for entry in "${search_dir}/*"
Les autres réponses ici sont excellentes et répondent à votre question, mais c'est le meilleur résultat Google pour "bash obtenir la liste des fichiers dans le répertoire", (que je cherchais pour enregistrer une liste de fichiers) alors j'ai pensé publier un réponse à ce problème:
Si vous voulez seulement un certain type (par exemple des fichiers .txt):
Notez que $ search_path est facultatif; ls> filename.txt fera le répertoire courant.
la source
ls
pour analyser les noms de fichiers? Je n'ai jamais entendu parler de cela auparavant.C'est une façon de le faire où la syntaxe est plus simple à comprendre pour moi:
./
est le répertoire de travail actuel mais peut être remplacé par n'importe quel chemin*.txt
renvoie n'importe quoi.txtVous pouvez vérifier facilement ce qui sera répertorié en tapant la
ls
commande directement dans le terminal.Fondamentalement, vous créez une variable
yourfilenames
contenant tout ce que la commande de liste renvoie en tant qu'élément séparé, puis vous la parcourez en boucle. La boucle crée une variable temporaireeachfile
qui contient un seul élément de la variable dans laquelle elle boucle, dans ce cas un nom de fichier. Ce n'est pas nécessairement mieux que les autres réponses, mais je trouve cela intuitif car je suis déjà familier avec lals
commande et la syntaxe de la boucle for.la source
A
,B
etC
. Vous créez des fichiers appelésB\nC
etD
, puis choisissez de les supprimer. Un logiciel qui ne gère pas ce droit pourrait finir par supprimer les fichiers préexistants B et C à la place, même si vous ne disposiez pas de permission de le faire.)la source
la source
xargs -0 -i echo "{}"
commande, voulez-vous m'expliquer un peu? En particulier, que fait la-i echo "{}"
partie? J'ai également lu laman
page qui-i
est obsolète maintenant et nous devrions utiliser-I
insted.-i
remplace{}
par l'arg.{}
c'est la chaîne qui est remplacée par les correspondances par lafind
commande.xargs
? par défaut,find
imprime ce qu'il trouve ... vous pouvez tout supprimer-print0
.Variations
Remarques:
.
: dossier en cours-maxdepth 1
pour rechercher récursivement-type f
: trouver des fichiers, pas des répertoires (d
)-not -path '*/\.*'
: ne pas retourner.hidden_files
sed 's/^\.\///g'
: supprimer le préfixé./
de la liste de résultatsla source
Voici une autre façon de lister les fichiers dans un répertoire (en utilisant un outil différent, pas aussi efficace que certaines des autres réponses).
echo *
Sort tous les fichiers du répertoire courant. Lafor
boucle itère sur chaque nom de fichier et s'imprime sur stdout.De plus, si vous recherchez des répertoires dans le répertoire, placez-le dans la
for
boucle:test -d
vérifie si le fichier est un répertoire.la source
La réponse acceptée ne renverra pas le préfixe des fichiers avec un. Pour faire cela, utilisez
la source
Sur la version Linux avec laquelle je travaille (x86_64 GNU / Linux), les travaux suivants:
la source
$search_dir
signifie qu'il se brise s'il y a un espace dans le nom du répertoire. (Dans ce cas, vous pouvez vous en tirer sans citer$entry
, mais il serait préférable de le citer.)mkdir "x y"; touch "x y/1.txt"; search_dir="x y"; for entry in $search_dir/*; do echo $entry; done
. La boucle s'exécute deux fois, une fois l'impressionx
et la deuxième foisy/*
, ce qui n'est probablement pas le résultat attendu.search_dir="x y"; for entry in $search_dir/*; do if [ -d "$entry" ]; then rm -rf "$entry"; fi; done
. S'il y a aussi unx
répertoire dans le répertoire courant, il est sommairement supprimé, simplement parce que vous n'avez pas cité votre variable!Entrez simplement cette commande simple:
la source