GNU/Linux >> Znalost Linux >  >> Linux

linuxové použití zástupných znaků v cp a mv

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.


Linux
  1. 4 Základní a praktické použití příkazu Cut v systému Linux

  2. Linux df příkaz

  3. Linuxový příkaz cat

  1. Využití paměti Linuxu

  2. Linux Cat Command:Použití a příklady

  3. Načíst využití CPU a paměti jedním procesem v Linuxu?

  1. Příkaz Linux Sed:Použití a příklady

  2. Jak komprimovat soubory a adresáře v systému Linux (s příklady)

  3. Jak komprimovat a dekomprimovat soubory v Linuxu