Comment pouvez-vous déplacer (ou copyr) tous les files vers un directory avec le même préfixe de nom de file?

Utiliser Bash

Donc, disons que j'ai un tas de files randomment placés dans un directory parent ~/src , je veux récupérer tous les files correspondant à un certain suffixe et les déplacer (ou les copyr) dans un directory ~/dist .

Supposons à cet effet que tous les noms de files ont cette convention d'appellation:

 <filename_prefix>.<filename_suffix> 

J'ai découvert que c'était un moyen rapide d'get tous les files avec un filename_suffix particulier et de les mettre dans un dossier dist:

 mkdir ~/dst find source -name "*.xxx" -exec mv -i {} -t ~/dst \; 

Maintenant, un pas de plus … comment puis-je utiliser la sortie de find, dans ce cas filename , et utiliser le filename_prefix pour générer un directory du même nom dans ~/dist puis déplacer (ou copyr) tous les files avec ce préfixe dans le directory approprié?

 mkdir ~/dst find source -name "*.xrt,*.ini,*.moo" -exec mv -i {} -t ~/dst \; 

Essentiellement, comment puis-je modifier la command ci-dessus (ou peut-être utiliser une autre command) pour créer une structure comme celle-ci

(SORTIE)

 ~/dist/people/people.xrt ~/dist/games/games.xrt ~/dist/games/games.moo ~/dist/games/games.ini ~/dist/monkeys/monkeys.ini ~/dist/monkeys/monkeys.xrt 

à partir d'un tree de directorys comme celui-ci?

(CONTRIBUTION)

 ~/src/xrt/people.xrt ~/src/xrt/games.xrt ~/src/conf/games.ini ~/src/pack/monkeys.xrt ~/src/e344/games.moo ~/src/e344/monkeys.moo ~/src/en-us/monkeys.ini 

Ce serait un enfer de dire find quoi faire dans ce cas.

Mieux utiliser la coquille:

 for i in **/*.{xrt,ini,moo}; do FILE=$(basename "$i") DIR=~/dst/${FILE%.*} echo mkdir -p -- "$DIR" echo mv -i -t "$DIR" -- "$i" done 

Utilisez shopt -s globstar pour faire le ** glob travail (ou utilisez zsh!). Et supprimez l' echo plus tard si la command imprime ce que vous voulez.

sortingcher find command line:

 find source -name "*.xrt,*.ini,*.moo" -exec env file={} bash -c 'base="$(basename "$file")";dir="dst/${base%.*}";mkdir -p "$dir";cp "$file" "$dir"' \; 

en fait un travail pour appeler le script bash dans find LOL.

= P