2016-06-30 22 views
0

Meine list.txt Datei hat ein paar hundert Einträge, die auf Dateinamen zeigen, die auf der /tmp Partition liegen. Ich sammle Dateien, die mit "a" beginnen, z. B. apples.txt, andromeda.txt usw., um sie in ein Verzeichnis zu kopieren.AIX Unix-Befehl zum Abrufen des ersten Elements, dann zum nächsten gehen

aber ich will nicht all die Dateien kopieren, sondern nur die ersten Datei gefunden. Es muss nicht sortiert werden; nur der erste.

Wie mache ich das? Irgendwelche Tipps sind willkommen.

#!/bin/bash 

for i in `/usr/bin/cat /tmp/list.txt` 
    do 
    find /tmp/$i -name a* -exec cp {} /tmp/found_first_file_start_with_a \; 
    done 
+2

Sie mich verloren. Wenn '/ tmp/list.txt' * file * Namen enthält, warum verwenden Sie' find' (das Verzeichnisse als Positionsparameter verwendet)? –

+0

Durchsuchen Sie nicht einfach die Datei ('list.txt') nach der ersten Zeile, wo die letzte Komponente des Namens mit' a' beginnt? Die Verwendung von 'find' scheint so verschwenderisch zu sein, es sei denn, einige der Namen wurden möglicherweise entfernt, bevor Sie die Kopie erstellen können (und es gibt verschiedene Möglichkeiten, falls dies zu Ihrem Problem gehört). Vielleicht 'sed -n '\%/a [^ /] * $% {p; q;}'/tmp/list.txt'? –

+0

Die angenommene Antwort stimmt nicht mit meiner Interpretation Ihrer Frage überein: 'Für alle Unterverzeichnisse von/tmp geben Sie in /tmp/list.txt eine Datei beginnend mit dem Buchstaben a in ein anderes Verzeichnis'. Können Sie Ihre Frage so bearbeiten, dass andere verstehen, was Sie wollten und warum Sie list.txt verwenden? –

Antwort

1

find Forget, versuchen Sie dies:

set -- /tmp/a* 
test -z "$1" || cp "$1" /tmp/found_first_file_start_with_a 
+1

Einige der Dateien befinden sich möglicherweise in Unterverzeichnissen unter '/ tmp' und möglicherweise gibt es keine Datei, die direkt in'/tmp' mit 'a' beginnt, sodass Ihr Glob nicht zugeordnet werden kann eine existierende Datei (und in Bash müsste man 'shopt -s nullglob' setzen, um nichts zu bekommen, anstatt den Namen'/tmp/a * 'zu erzeugen). –

0

Sie können das -quit Befehl find es nach dem ersten zu stoppen bekommen:

find /tmp -name a* -exec cp {} /tmp/found_first_file_start_with_a \; -quit 

wird dies jedoch verlassen nur, wenn die exec true zurückgibt. Wenn der cp-Befehl fehlschlägt (aus welchen Gründen auch immer), sucht er weiter nach weiteren Dateien. So können Sie stattdessen drucken nur die erste Datei und erfassen sie für einen separaten cp Befehl:

file=$(find /tmp -name a* -print -quit) 
cp $file /tmp/found_first_file_start_with_a 
+0

Das AIX 7.2-Handbuch für ['finden'] (https://www.ibm.com/support/knowledgecenter/ssw_aix_72/com.ibm.aix.cmds2/find.htm) scheint' 'quit' 'nicht aufzulisten - obwohl es ziemlich nah an einem GNU 'find' in seinen Fähigkeiten ist. –

+0

korrekt. Die Option -quit ist in aix nicht gültig. – user2585000