find
příkaz lze celkem stručně použít v jednoduchých případech, kdy chcete provádět operace se zástupnými (nebo složitějšími) shodami názvů souborů. Techniku níže lze uložit do paměti ... téměř!
Funguje to tak, že necháte find
příkaz spustí další příkaz na každém nalezeném souboru. Tento příklad můžete spustit nasucho pomocí echo
místo / před mv
.
Pokud bychom chtěli přesunout všechny soubory v aktuálním adresáři se jménem začínajícím 'report', do jiného paralelního adresáře s názvem 'reports' :
find . -name "report*.*" -exec mv '{}' ../reports/ \;
Řetězec zástupného znaku musí být v uvozovkách, {} označující název souboru, který byl 'nalezen', musí být v uvozovkách a poslední středník musí být escapován – to vše kvůli Bash/shell zpracování těchto znaků.
Podívejte se na manuálovou stránku pro find
pro další použití:https://linux.die.net/man/1/find
Pojďme si chvíli povídat o tom, jak zástupné znaky fungují.
cp *.txt foo
ve skutečnosti nevyvolá cp
s argumentem *.txt
, pokud existují nějaké soubory odpovídající této glob. Místo toho běží něco takového:
cp a.txt b.txt c.txt foo
Podobně něco jako
mv *.txt *.old
...nemůže vědět, co dělat, protože když je vyvolán, vidí:
mv a.txt b.txt c.txt *.old
nebo v horším případě, pokud již máte soubor s názvem z.old
, uvidí:
mv a.txt b.txt c.txt z.old
Proto musíte použít různé nástroje. Zvažte:
# REPLACES: mv /data/*/Sample_*/logs/*_Data_time.err /data/*/Sample_*/logs/*_Data_time_orig.err
for f in /data/*/Sample_*/logs/*_Data_time.err; do
mv "$f" "${f%_Data_time.err}_Data_time_orig.err"
done
# REPLACES: cp /data/*/Sample_*/scripts/*.sh /data/*/Sample_*/scripts/*_orig.sh
for f in /data/*/Sample_*/scripts/*.sh; do
cp "$f" "${f%.sh}_orig.sh"
done
# REPLACES: sh /data/*/Sample_*/scripts/*_orig.sh
for f in /data/*/Sample_*/scripts/*_orig.sh; do
if [[ -e "$f" ]]; then
# honor the script's shebang and let it choose an interpreter to use
"$f"
else
# script is not executable, assume POSIX sh (not bash, ksh, etc)
sh "$f"
fi
done
To používá rozšíření parametru k odstranění konce starého názvu před přidáním nového názvu.