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

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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.