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 find
Befehl 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 find
Version ab.
Antwort2
Wenn Sie die ursprüngliche Struktur unterhalb des Verzeichnisses beibehalten möchten /somefolder/somedir
, können Sie rsync
anstelle 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