Comment supprimer le préfixe filename avec un shell Posix

Comment puis-je supprimer le préfixe du nom de fichier dans Bash comme dans L'exemple suivant:

XY TD-11212239.pdf

pour obtenir de l'

11212239.pdf

I. e, supprimer XY TD-?

23
demandé sur codeforester 2012-05-10 18:18:40

5 réponses

vous avez donné très peu d'informations, mais en supposant que vous faites cela dans bash, et que vous avez une liste de fichiers dont le préfixe doit être supprimé, vous pouvez passer la liste par sed:

Par exemple:

./generate_your_list_of_files | sed -e 's/^prefix//'

ou si votre liste de fichiers sont séparés par un espace:

echo TD-file1 TD-file2.x.yt TD-file3-beep | sed -e 's/\<TD-//g'

le premier correspond au préfixe au début de la ligne et le supprime. Le second correspond à TD- (ou tout autre préfixe que vous souhaitez substituer) seulement quand il arrive au début d'un mot et de le remplacer dans tous les matches dans toutes les lignes. Ce devenir dangereuses si, par exemple, un fichier de la forme TD-file\ that\ TD-contains\ space.txt devient file\ that\ contains\ space.txt

comme note d'accompagnement, n'obtenez pas votre liste de fichiers en utilisant ls. C'est une terrible erreur. Si vous avez besoin d'obtenir une liste de fichiers à utiliser et à référencer à plus d'un endroit, je suggère de les mettre dans un tableau:

files=(*)

et puis, avec cette tableau.


en raison de requêtes populaires (Le seul commentaire ci-dessous), voici comment renommer tous les fichiers du répertoire qui commencent par XY TD- tel que le préfixe soit supprimé (grâce à @tripleee):

for file in prefix*;
do
    mv "$file" "${file#XY TD-}"
done
26
répondu Shahbaz 2017-01-30 19:24:25

Vous avez dit POSIX des obus qui comprendraient BASH, Kornshell, Ash, Zsh et Dash. Heureusement, tous ces coquillages font l'affaire!--9 -- > filtrage des motifs sur des valeurs variables.

les Modèles sont ce que vous utilisez lorsque vous spécifiez des fichiers avec des choses comme * sur la ligne de commande Unix/Linux:

$ ls *.sh  # Lists all files with a `.sh` suffix

ces coquilles POSIX utilisent quatre types de filtrage:

  • ${var#pattern} - enlève la plus petite chaîne du côté gauche qui correspond au modèle.
  • ${var##pattern} - enlève la plus grande chaîne du côté gauche qui correspond au motif.
  • ${var%pattern} - enlève la plus petite chaîne du côté droit qui correspond au motif.
  • ${var%%pattern} - enlève la plus grande chaîne du côté droit qui correspond au motif.

Voici quelques exemples:

foo="foo-bar-foobar"
echo ${foo#*-}   # echoes 'bar-foobar'  (Removes 'foo-' because that matches '*-')
echo ${foo##*-}  # echoes 'foobar' (Removes 'foo-bar-')
echo ${foo%-*}   # echoes 'foo-bar'
echo ${foo%%-*}  # echoes 'foo'

vous n'avez pas vraiment expliqué ce que vous voulez, et vous n'avez pas inclus d'exemple de code, donc c'est dur de trouver quelque chose qui va faire ce que vous voulez. Cependant, l'utilisation de modèle de filtrage, vous pouvez probablement comprendre exactement ce que vous voulez faire avec vos noms de fichier.

file_name="XY TD-11212239.pdf"
mv "$file_name" "${file_name#*-}" # Removes everything from up to the first dash
25
répondu David W. 2014-08-27 21:05:57

Vous pouvez également utiliser le renommer outil

installez-le avec homebrew

brew install rename

puis lancez la commande ci-dessous à partir du répertoire pour supprimer le "prefix -" de tous les fichiers

rename -d prefix- *

3
répondu KJ Prince 2014-08-27 20:16:41

En plus de l'extraction de sous-chaîne dans d'autres réponses, vous pouvez également faire usage de sous-chaîne de remplacement. Le fichier:

fn="XY TD-11212239.pdf"

puis soustrayant le remplacement de:

fn_new=${fn//*TD-/}

Va aussi faire ce que vous voulez.

2
répondu David C. Rankin 2014-08-27 20:50:27
$ s='XY TD-11212239.pdf'
$ echo "${s#XY TD-}"
11212239.pdf

si votre but est d'effectuer un renommage de masse:

while IFS= read -r -d '' filename; do
  mv "$filename" "${filename#XY TD-}"
done < <(find . -type f -name 'XY TD-*' -print0)

Notez que <() est un bash extension n'est pas présent dans POSIX sh. Vous pouvez le remplacer par un pipeline de la forme find ... | while.

de Même, -print0 est une extension GNU Non présente dans POSIX find. POSIX find ne fournit aucun moyen équivalent pour localiser les fichiers qui est sûr pour les noms contenant newlines, ce qui rend difficile à remplacer.

1
répondu Charles Duffy 2014-08-27 19:58:53