Comment puis-je récupérer la sortie de la ls ou trouver la commande pour stocker tous les noms de fichier dans un tableau?
Besoin pour traiter les fichiers dans le répertoire courant un à la fois. Je suis à la recherche d'un moyen de prendre la sortie de ls
ou find
et de stocker de la valeur en tant qu'éléments d'un tableau. De cette façon, je peux manipuler les éléments d'un tableau en tant que de besoin.
- SiegeX Comment puis-je accepter les réponses? J'ai répondu et a remercié ceux qui ont répondu, le meilleur et le upvoted quand j'ai eu le privilège. Ce que je peux faire de plus?
Vous devez vous connecter pour publier un commentaire.
Pour répondre à votre question, utilisez la commande suivante:
Exemple
Toutefois, si vous voulez juste pour traiter les fichiers un à un, vous pouvez soit utiliser
find
's-exec
option si le script est un peu simple, ou vous pouvez faire une boucle de quoi trouver les retours de la sorte:IFS= read -r -d
est en train de faire?read
commande de ne pas traiter de la barre oblique inverse est aussi un spécial caractère d'échappement et de délimiter chaque mot avec le NUL de caractère depuis que nous avons ditfind
de l'utiliser comme délimiteur avec-print0
. LeIFS=
partie essentiellement unsets l'Interne spécial Séparateur de Champ variable d'environnement afin de ne pas effectuer de couper un mot sur des tabulations ou des espaces ou de nouvelles lignes. Le TLDR version, c'est que ces commandes faire de sorte que vous pouvez effectuer une itération sur le nom d'un fichier sans matther ce genre de personnages qu'il contient.IFS=
devant le tout :IFS = ; while ...
?find ... | while ....
?ne pouvez pas obtenir plus simple que ça!
edit: hmm - comme par Dennis Williamson commentaire, il semble que vous pouvez!
edit 2: bien que l'OP demande précisément comment analyser la sortie de
ls
, je voulais juste faire remarquer que, comme les commentateurs ci-dessous l'avons dit, la bonne réponse est "vous n'avez pas". Utilisationfor i in *
ou similaire à la place.for i in *
est encore plus simple!for i in *; do ...
fait la même chose, sauf qu'il n'est pas confondu par de drôles de caractères dans les noms de fichiers, et s'exécute plus rapidement (car il n'a pas de générer un autre processus).*
:for in in $path/*
for f in "$path"/*
*
empty répertoire.*
, qui signifie "si il n'y a pas de fichiers"). Dans de nombreux cas, cela conduit à un "fichier non trouvé" type d'erreur, qui, si ce que vous voulez. Mais si c'est un problème dans votre script, vous pouvez utilisershopt -s nullglob
avant (etshopt -u nullglob
après pour éviter des problèmes plus tard), ou dans une boucle, vous pouvez ajouterif [[ ! -e "$i" ]]; then continue; fi
au début de la boucle, de sorte qu'il va sauter fichiers inexistants.Vous avez réellement n'avez pas besoin d'utiliser la commande ls/trouver les fichiers dans le répertoire courant.
Suffit d'utiliser une boucle for:
Et si vous voulez traiter les fichiers cachés, vous pouvez définir l'option relative:
Cette dernière commande fonctionne en bash seulement.
%files
devrait être$files
. Aussi, si vous avez Bash 4.X vous pouvez définirshopt -s globstar
et l'utilisationfor files in **; do
être récursive; éliminer complètement l'utilisation defind
En fonction de ce que vous voulez faire, vous pouvez utiliser xargs:
Par exemple. xargs agira sur chaque article retourné.
cp -v dir2 <otherfiles>
est problématique...cp
prend en charge, vous pouvez utiliserxargs cp -v --target-drectory dir2
.find ... -print0 | xargs -0
permettrait de résoudre ce problème. Exactement comment est-il raté? Il fonctionne pour moi.