Portál AbcLinuxu, 15. května 2025 18:12
Zdravim, potreboval bych upravit skript (pro Debian):
#/bin/bash
FILES=/mnt/cml-homes/*
for f in $FILES
do
echo "Processing $f file..." # take action on each file. $f store current file name
echo $f
first=${f:15:1}
echo $first
ln -s $f /mnt/cml-homes-alpha/$first
done
Jeste nez se provede cyklus, bych potreboval aby se ty stavajici linky i neexistujici linky smazaly a znova vytvorily nove linky. Dekuji!
Řešení dotazu:
Nepotřebuješ smazat jen nevalidní symlinky?
tedy něco jako
find -L /mnt/cml-homes-alpha/ -maxdepth 1 -type l -delete
pohraj si s s optionami -maxdepth, -(x)type a podívejse na optiony -L -N -P v man find
nejdříve to samozřejmě zkus jen vypsat (bez -delete na konci), aby sis nesmazal něco co nechceš.
Také by mohlo jít (pro výpis nevalidních symlinků)
find -maxdepth 1 -xtype l
find /mnt/cml-homes-alpha/ -type l | xargs rm
-exec rm '{}' \;
find /mnt/cml-homes-alpha/ -type l -print0 | xargs -0 rm
Není potřebný ani xargs
, ani oddělený proces pro každý rm
. Tohle je, mimochodem, asi tak desáté vlákno poradny, kde lidé sveřepě ignorují možnost nahradit středník za '+'
v argumentech find
.
man find
tvrdí:
The command line is built in much the same way that xargs builds its command lines.
Samozřejmě, že ano. Nikde se přece netvrdí, že se ten příkaz spustí právě jednou. Spustí se tolikrát, kolikrát je to potřeba s ohledem na limit velikosti polí argv
na daném systému.
Ten středník je zbytečný. Použij -exec rm '{}' +
(Totéž platí pro všechny příkazy, které přijímají v argumentech seznam souborů.)
-f, --force remove existing destination files
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.