benutze den Dateinamen nur zum Verschieben

benutze den Dateinamen nur zum Verschieben

Ich muss einige Dateien von einem Ordner in einen anderen verschieben. Die Kriterien werden durch Suchen und Grep festgelegt. Beim Versuch, die Dateien zu verschieben, wird das Problem behoben.

Der eigentliche Versuch istmv /somefolder/export//somefolder/storage/testfileOLD.txt

Was ich erwartet hatte warmv /somefolder/storage/testfileOLD.txt /somefolder/export/testfileOLD.txt

Der Befehl, den ich verwende:

find /somefolder/storage/ -type f -name "*OLD*" -newermt '2019-05-1' ! -newermt '2019-06-7' -exec grep -qiF 'closed' {} \; -exec mv {} /somefolder/export/{} \;

Ich habe es bereits mit versucht -exec basename {}, das gibt mir das richtige Ergebnis, aber wenn ich das mv ändere in

-exec echo {} /somefolder/export/$(basename {}) \;

um zu prüfen, ob es funktioniert, bekomme ich immer noch das /somefolder/export//somefolder/storage/testfileOLD.txt.

Antwort1

$(basename {})schlägt fehl (besser: einfach eine leere Zeichenfolge). Die hier aufgerufene Subshell wird nicht {}in den Dateinamen erweitert, da dieser spezifisch für find ist und nicht in die von Ihrem Befehl erstellte Subshell exportiert wird.

Sie können dies testen, indem Sie ausführen

find -exec echo "this will be empty:" $(basename '{}') \;

Ich schlage vor, Sie schreiben ein kleines Skript:

#!/bin/bash
mv "$1" /somefolder/export/"$( basename ${1})"

und führen Sie es in Ihrem findBefehl aus:

find /dir/ <specs> -exec grep -qiF 'closed' '{}' \; -exec bash script.sh '{}' \;

Soweit ich weiß, hängt das Verhalten der Weiterleitung '{}'an Subshells von Ihrer findVersion ab.

Antwort2

Wenn Sie die ursprüngliche Struktur unterhalb des Verzeichnisses beibehalten möchten /somefolder/somedir, können Sie rsyncanstelle von verwenden mv.

Versuchsaufbau:

/somefolder/storage/testfileOLD.txt
/somefolder/storage/subdir/fileOLD.txt

Erwartetes Ergebnis nach dem Umzug:

/somefolder/export/testfileOLD.txt
/somefolder/export/subdir/fileOLD.txt

Die Befehle:

# first, create a file list of relative paths (some arguments removed for simplicity)
$ find /somefolder/storage -type f -name "*OLD*" -printf '%P\n' > /tmp/filelist

# cat to illustrate its content
$ cat /tmp/filelist
subdir/fileOLD.txt
testfileOLD.txt

# then rsync using `--remove-source-files` to move the files 
$ rsync -av --remove-source-files --files-from=/tmp/filelist /somefolder/storage /somefolder/export

verwandte Informationen