272 votes

Comment obtenir la liste des fichiers d'un répertoire dans un shell script ?

J'essaie d'obtenir le contenu d'un répertoire en utilisant le shell script.

Mon script est :

for entry in `ls $search_dir`; do
    echo $entry
done

donde $search_dir est un chemin relatif. Cependant, $search_dir contient de nombreux fichiers dont le nom comporte des espaces. 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 me rendre dans 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 y $work_dir et je dois travailler sur les deux simultanément, en les lisant, en y créant/supprimant des fichiers, etc.

Que dois-je faire maintenant ?

PS : j'utilise bash.

12voto

Noel Yap Points 3008
find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}"

5voto

Kolyan1 Points 58

Semblable à la réponse acceptée - mais ne répertorie que les noms de fichiers au lieu des chemins d'accès complets :

Il semble que la réponse ait été donnée il y a un certain temps, mais je pense que je veux aussi contribuer à une réponse qui liste simplement les fichiers dans le répertoire souhaité, plutôt que les chemins d'accès complets.

    #search_dir=/the/path/to/base/dir/
    IFS=$'\n' #for in $() splits based on IFS
    search_dir="$(pwd)"
    for entry in $(ls $search_dir)
    do
        echo $entry
    done

Si vous souhaitez également filtre pour un fichier spécifique vous ajouteriez un grep -q déclaration.

    #search_dir=/the/path/to/base/dir/
    IFS=$'\n' #for in $() splits based on IFS
    search_dir="$(pwd)"
    for entry in $(ls $search_dir)
    do
        if grep -q "File should contain this entire string" <<< $entry; then
        echo "$entry"
        fi
    done

Références :

Pour plus d'informations sur l'IFS, voir aquí .

Pour plus d'informations sur la recherche de sous-chaînes dans l'interpréteur de commandes, voir aquí .

4voto

TrevTheDev Points 341

La réponse acceptée ne renverra pas les fichiers dont le préfixe est '. . ' Pour ce faire, utilisez

for entry in "$search_dir"/* "$search_dir"/.[!.]* "$search_dir"/..?*
do
  echo "$entry"
done

0voto

SnoopDogg Points 11

Voici une autre façon de lister les fichiers à l'intérieur d'un répertoire (à l'aide d'un outil différent, moins efficace que certaines des autres réponses).

cd "search_dir"
for [ z in `echo *` ]; do
    echo "$z"
done

echo * Affiche tous les fichiers du répertoire actuel. La fonction for itère sur chaque nom de fichier et l'imprime sur stdout.

En outre, si l'on recherche des répertoires à l'intérieur du répertoire, il faut placer ceci à l'intérieur de l'élément for boucle :

if [ test -d $z ]; then
    echo "$z is a directory"
fi

test -d vérifie si le fichier est un répertoire.

-1voto

alubhate Points 27
ls $search_path ./* |grep ".txt"|
while IFS= read -r line
do 
   echo "$line"
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