Wie können Sie alle Dateien in ein Verzeichnis mit demselben Dateinamenpräfix verschieben (oder kopieren)?

9

Verwenden von Bash

Nehmen wir also an, ich habe eine Reihe von Dateien zufällig in einem übergeordneten Verzeichnis abgelegt. ~/srcIch möchte alle Dateien abrufen, die einem bestimmten Suffix entsprechen, und sie in ein ~/distVerzeichnis verschieben (oder kopieren) .

Nehmen wir zu diesem Zweck an, dass alle Dateinamen diese Namenskonvention haben:

<filename_prefix>.<filename_suffix>

Ich fand heraus, dass dies eine schnelle Möglichkeit war, alle Dateien mit einem bestimmten filename_suffixOrdner abzurufen und in einem dist-Ordner abzulegen:

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

Nun noch einen Schritt weiter ... Wie kann ich in diesem Fall die Ausgabe von find verwenden filenameund mit die filename_prefixOption ein Verzeichnis mit demselben Namen generieren ~/distund dann alle Dateien mit diesem Präfix in das entsprechende Verzeichnis verschieben (oder kopieren)?

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

Wie ändere ich im Wesentlichen den obigen Befehl (oder verwende möglicherweise einen anderen Befehl), um eine Struktur wie diese zu erstellen

(AUSGABE)

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

aus einem Verzeichnisbaum wie diesem?

(EINGANG)

~/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
Qodeninja
quelle

Antworten:

10

Es wäre eine Hölle zu sagen, findwas in diesem Fall zu tun ist.

Verwenden Sie besser die Shell:

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

Verwenden Sie shopt -s globstardiese **Option , damit der Glob funktioniert (oder verwenden Sie zsh!). Und entfernen Sie das echos später, wenn der Befehl druckt, was Sie wollen.

Stéphane Gimenez
quelle
mit bash ist das das gleiche?
Qodeninja
@codeninja shopt -s globstar, siehe meine Bearbeitung. Wenn es nur zwei Ebenen gibt, können Sie diese verwenden */*.*und das Snippet funktioniert in jeder Shell.
Gilles 'SO - hör auf böse zu sein'
2

Betrug finden Befehlszeile:

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

Eigentlich eine Lösung für den Aufruf von Bash-Skript in Find LOL.

= P.

Yuyichao
quelle
1
Ratet mal, was passiert, wenn es eine Datei gibt, die heißt ... happy rm -rf /! Diese Art von Code verdient eine -1.
Stéphane Gimenez
Ihre Bearbeitung ist nicht genug: Nehmen wir an, Sie haben auf einen Link geklickt und ihn heruntergeladen Yay" rm -rf / "Rox0r.avi. Auch hier gibt es ein Problem…
Stéphane Gimenez
(Und es gibt keine Möglichkeit, diese Art der Substitution sicher zu machen).
Stéphane Gimenez
1
Ah, vielleicht ist es möglich, das anders zu machen. Es scheint, dass Folgendes funktioniert : -exec bash -c 'command which uses "$1"' bash '{}' ';'. Nun, es ist sowieso ziemlich sinnlos.
Stéphane Gimenez
1
@ StéphaneGimenez fertig, Bash ist nicht das einzige, was man verwenden kann. LOL
Yuyichao