GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Sowohl den Basisnamen als auch den vollständigen Pfad in find -exec verwenden

versuchen Sie so etwas:

find  /home/mine -iname "*.png" -printf "%P\n " | xargs  -I % -n1 cp %  /home/mine/pngcoppies/copy% 

Um zu sehen, was passiert, wenn Sie die Suche ausführen, geben Sie einfach set -xv ein
-x :Gibt Befehle und ihre Argumente aus, während sie ausgeführt werden.
-v :Gibt Shell-Eingabezeilen aus, während sie gelesen werden.

Hier ist, was ich habe:

find . -name "*.xml" -exec echo {} \;

Ergibt die Ausgabe:

./log.xml
./svnLog.xml

Und wenn ich versuche:

set -xv
find . -name "*.xml" -exec echo {} \;

Ich bekomme :

find . -name "*.xml" -exec echo {} \;
+ find . -name '*.xml' -exec echo '{}' ';'
./log.xml
./svnLog.xml

Und dann find execute echo, indem der gefundene Dateiname anstelle des Literals übergeben wird:'{}'

aber wenn Sie etwas zu {} hinzufügen wie unten:

find . -name "*.xml" -exec echo something{} \;
+ find . -name '*.xml' -exec echo 'something{}' ';'
something{}
something{}

Hier wird das Echo zweimal für die 2 xml-Dateien ausgeführt, die ich habe und da es keine '{}' mehr gibt die Parameterliste der Exec ist, wird sie nicht ersetzt. also haben wir den echo 'something{}' für jede gefundene Datei.

Um damit fertig zu werden, können Sie daran denken, echo auszuführen, indem Sie ihm den Dateinamen als Parameter übergeben, wie zum Beispiel :

sh -xvc 'echo sothing/$0' filename

Wir wissen bereits, was -x ist und -v . -c ist, den Befehl aus der Zeichenfolge danach zu erhalten (man sh )

das Ergebnis ist also:

sh -xvc 'echo somthing/$0' filename
+ sh -xvc 'echo somthing/$0' filename
echo somthing/$0
+ echo somthing/filename
sothing/filename

Ich habe 'echo somthing/$0 verwendet ' zwischen ' ', damit $0 nicht von der aktuellen Shell erweitert wird. versuchen Sie es mit " " und Sie werden die Erweiterung von $0 sehen;)

Um auf Ihr „Problem“ zurückzukommen, sollte die Suche wie folgt formatiert sein:

find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;

Und wir bekommen :

find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;
+ find . -name '*.xml' -exec sh -xvc 'echo sothing/$0' '{}' ';'
echo sothing/$0
+ echo sothing/./log.xml
sothing/./log.xml
echo sothing/$0
+ echo sothing/./svnLog.xml
sothing/./svnLog.xml

Wie wir sehen können, wird die Suche den Shell-Befehl echo sothing/$0 ausführen ihm '{}' übergeben (ersetzt durch den von find gefundenen Dateinamen), sodass wir den gewünschten echo sothing/./log.xml erhalten

set +xv um den ausführlichen Modus zu entfernen, erhalten wir:

find . -name "*.xml" -exec sh -c 'echo "cp $0 someWhereElse/$0"' {} \;
cp ./log.xml someWhereElse/./log.xml
cp ./svnLog.xml someWhereElse/./svnLog.xml

In Ihrem Fall müssen Sie also nur die Kopie in einer Sub-Shell ausführen (fügen Sie sh hinzu oder bash oder Sie bevorzugen Shell nach dem exec) und lassen Sie find übergeben Sie den Dateinamen als Parapeter an das;)

find /home/mine -iname "*.png" -exec sh -c 'cp $0 /home/mine/pngcoppies/copy/$0' {} \;

Hoffe, das kann helfen, und entschuldige mich für mein Englisch.


Von man find:"Das primäre -execdir ist identisch mit dem primären -exec, mit der Ausnahme, dass das Dienstprogramm aus dem Verzeichnis ausgeführt wird, das die aktuelle Datei enthält. Der Dateiname, der durch die Zeichenfolge ``{}'' ersetzt wird, ist nicht qualifiziert."

find /home/mine -iname "*.png" -execdir cp {} /home/mine/pngcoppies/copy{} \;

Linux
  1. Verwenden von sed zum Suchen und Ersetzen von Textdateien in Linux

  2. Verwenden von grep und sed zum Suchen und Ersetzen einer Zeichenfolge

  3. Wie finde ich den Pfad HADOOP_HOME unter Linux?

  4. Suchen und ersetzen Sie Text in einer Datei zwischen einem Zeilenbereich mit sed

  5. Entfernen von Dateien mit rm unter Verwendung von find und xargs

Wie verwende ich / (Verzeichnistrennzeichen) sowohl unter Linux als auch unter Windows in Python?

Listen Sie die Datei mit dem Befehl ls in Linux mit vollständigem Pfad auf

Systemd:Sowohl After als auch Requires verwenden

Wie führe ich mehrere Befehle aus, wenn ich find verwende?

Effiziente Tastenzuordnungen unter Mac und Linux

Wie finde ich vollständige Prozessargumente und zugehörige Listening-Ports?