Mon exigence est de lister tous les fichiers dans un répertoire, à l'exception des fichiers se terminant par ~
(fichiers de sauvegarde).
J'ai essayé d'utiliser la commande:
ls -l | grep -v ~
J'obtiens cette sortie:
asdasad
asdasad~
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell1.sh~
testshell2.sh
testshell2.sh~
testtwo.txt
testtwo.txt~
test.txt
test.txt~
Je souhaite obtenir uniquement ces fichiers:
asdasad
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell2.sh
testtwo.txt
test.txt
~
. Ces fichiers sont des fichiers de sauvegarde créés par certains éditeurs de texte.ls -l
(lettre ell) comprendrait les autorisations, les liens, le propriétaire, la taille et l'heure de modification pour chaque fichier répertorié. Ce qui produirait la sortie que vous montrez estls -1
(chiffre un) et sur de nombreux systèmes-1
est nécessaire pour produire une sortie à une seule colonne sur le terminal , mais quand ills
est canalisé (comme icigrep
) ou redirigé,-1
n'est pas nécessaire, il est déjà à une seule colonne .Réponses:
La raison pour laquelle cela ne fonctionne pas est que le tilde est étendu à votre répertoire personnel, donc
grep
ne voit jamais un tilde littéral. (Voir par exemple le manuel de Bash sur l'extension Tilde .) Vous devez le citer pour empêcher l'expansion, c.-à-d.Bien sûr, cela supprimera toujours toutes les lignes de sortie avec un tilde n'importe où, même au milieu d'un nom de fichier ou ailleurs dans la
ls
sortie (bien qu'il ne soit probablement pas susceptible d'apparaître dans les noms d'utilisateur, les dates ou autres). Si vous voulez vraiment ignorer les fichiers qui se terminent par un tilde, vous pouvez utiliserla source
L'implémentation GNU de
ls
(présente sur la plupart des systèmes Linux) a une option pour cela:-B
Ignorer les sauvegardes:la source
Si vous utilisez bash, assurez-vous qu'il
extglob
est activé:Ensuite, vous pouvez utiliser:
-d
pour ne pas afficher le contenu des répertoires!(*~)
tous les fichiers sauf ceux se terminant par~
Sur zsh, vous pouvez faire de même avec l'
kshglob
option ou en utilisant ses propres globs étendus:Étant donné que le suffixe à exclure ne comporte qu'un seul caractère, vous pouvez également faire correspondre les noms de fichiers où le dernier caractère n'est pas le tilde (cela devrait également fonctionner sans
extglob
):Mais l'idée générale est d'utiliser
ls --ignore-backups
.la source
Cela devrait aider:
Motif: le caractère ~ est remplacé par votre répertoire personnel avant l'exécution de la commande. Essayer
et
la source
Comme mentionné dans d'autres réponses, la raison pour laquelle vous rencontrez probablement des problèmes est que vous n'avez pas cité ou échappé au tilde.
Pour un cas d'utilisation particulier, j'ai utilisé l'expansion du nom de fichier shell pour faire quelque chose de similaire. Je l'utilise depuis environ 2003, ce qui signifie qu'il a travaillé sur une très grande variété d'implémentations de shell sur différents types de systèmes. (ici j'utilise aussi
-C
parce que je veux un bel affichage en colonnes triées)(une limitation de l'utilisation de l'expansion du nom de fichier shell est bien sûr qu'un répertoire avec un très grand nombre de fichiers (non de sauvegarde) entraînera une expansion dépassant la taille de la liste d'arguments disponible, bien que sur la plupart des systèmes modernes cette limite soit assez élevée, souvent 250 Ko ou plus, parfois beaucoup plus)
la source
ls | grep -v '~$'
est la solution rapide. Il utilise ls pour lister tous les fichiers (non cachés), puis utilise grep avec-v
(correspondance inversée, c'est-à-dire exclusion) pour exclure toutes les lignes avec le tilde (~
) à la fin ($
).CEPENDANT, si vous avez des fichiers nommés comme quelque chose1, quelque chose2, c'est un ÉNORME indicateur nauséabond que vous avez un mauvais flux de travail, que vous devez corriger à la source, pas avec des hacks maladroits comme la modification du fonctionnement de ls.
Si vous vous retrouvez à nommer des fichiers avec des numéros de version, comme test1 et test2 ou testone et testtwo, alors ce que vous voulez vraiment, c'est un système de contrôle de version, comme
git
.Cela est particulièrement vrai dans votre cas, lorsque vous disposez de plusieurs versions de plusieurs fichiers et que le contrôle de version semble devoir être coordonné entre tous les fichiers.
Les systèmes de contrôle de version vous permettent de superposer essentiellement une fenêtre temporelle sur le système de fichiers, de sorte que vous ne voyez qu'un seul
test
fichier, mais sous le capot (via le programme de contrôle de version), toutes les versions sont disponibles pour rechercher, récupérer, revenir à, comparer avec, etc. .Une fois que vous avez configuré cela, vous n'avez plus besoin de fichiers de sauvegarde de votre éditeur, car le contrôle de version a l'historique des fichiers depuis que vous avez commencé à l'utiliser, même si vous avez effectué mille modifications depuis. Vous pouvez même "brancher" la chronologie de l'historique, essayer une nouvelle idée, remonter dans le temps et ensuite avancer pour essayer une autre idée, si vous en avez besoin.
la source
Bien que de nombreuses réponses soient correctes (j'aime
@Foon
celle en particulier), je noterais que l'obtention de la liste des nomsls -l
est un peu boiteux pour diverses raisons.Sans surprise, l'outil approprié pour rechercher des fichiers est
find
.L'un de ses résultats est qu'il est capable de gérer lui-même la "logique de sélection", par exemple:
qui dit littéralement
find
:.
-maxdepth 1
Là, recherchez les entités qui
-type f
-a
~
:! -name *~
(où le!
nie la directive suivante qui correspond aux noms de fichiers,-name *~
).(Pour que la correspondance complète sur le type et le nom apparaisse comme une unité logique, elle est entre parenthèses avec
(
et)
).-print
.Vous devez protéger certains caractères qui sont spéciaux pour le shell d'être interprétés par le shell, et c'est pourquoi les parenthèses et le bang
!
, sont échappés par une barre oblique inverse, et le modèle de nom*~
, est entouré de guillemets simples.La
find
commande possède un mini-langage très puissant grâce à l'utilisation de ses options. Par exemple, il peut être conseillé de traiter récursivement une arborescence (ou des arborescences) de système de fichiers complète, mais d'omettre certains répertoires lors de l'analyse. Il est possible de faire correspondre plusieurs attributs des fichiers, tels que l'heure de création ou de modification ou la taille de quoi que ce soit.la source