Nie licząc mv
, tak naprawdę wcale nie potrzebujesz do tego zewnętrznego procesu - możesz po prostu poofać .
ifsqz() ( LC_ALL=C sqz=$1
isf() { [ -e "$1" ] || [ -L "$1" ] ; }
set -- * ; set -f
for f do isf "$f" || break
IFS=$sqz; set -- $f; IFS=
isf "$*" || mv -- "$f" "$*"
done
)
Mimo to oznacza to mv
wywołanie na plik, a więc prawdopodobnie rename
lepiej. Chociaż powinno działać podane tylko POSIX mv
w $PATH
i POSIX powłoki.
Wymyśliłem do tego coś w rodzaju szalonego dema. Zestaw testowy jest generowany jak:
tee - - - - <<CGEN |\
dd cbs=90 conv=unblock |\
sed 'G;$!N'";s/^/touch -- '/;s/$/'/" |sh
$( #BEGIN CGEN
LC_ALL=C
i= n='"$((i=((i=i+1)==10||i==39||i==47)>0?(i+1):i))"'
printf '%b -_ ---___' $(
IFS=0; eval \
printf '"\\\\%04o\\\\%04o "' "$(
printf "$n"' "$i" '%s $(
printf %.252d
#END
))"))
CGEN
Po pierwsze, jako pierwszy potwierdzę, że powyższe polecenie daje wyniki, które można łatwiej uzyskać innymi sposobami. Ale inne środki prawdopodobnie nie pokazałyby równie dobrze, co można by zrobić z $IFS
odrobiną (chorej) wyobraźni.
Pierwszy bit jest więc dość prosty:
tee
usuwa 5 kopii danych wejściowych - heredocument o nazwie CGEN
dd
blokuje wprowadzanie nowego wiersza po 90 bajtów na blok i potoki, które ...
sed
łączy 2 z tych bloków na dwóch \n
znakach ewline, '
pojedynczo cytuje wyniki i przygotowuje ciąg znaków touch --
dla każdego cyklu wiersza przed odpływem do ...
sh
który następnie wykonuje wszystkie dane wejściowe jako polecenia powłoki
#CGEN
Nieco chociaż ... no, krótko ...
na dole printf
wydrukowano 252 0s
następny od ostatniego otrzymuje 252 ''
argumentów o pustym łańcuchu i dla każdego wypisuje zawartość znaku $n
następującego po nim" $i "
eval
interpretuje argumenty następnego printf
przed wydrukowaniem wyników tej interpretacji jako liczby ósemkowe poprzedzone 2 ukośnikami odwrotnymi
ostatni printf
wypisuje wartości bajtów dla tych liczb ósemkowych naraz, po których następuje łańcuch -_ ---___
dla każdej pary
$n
jest inicjowany do równania, które będzie zwiększane $i
o jeden dla każdej oceny, z wyjątkiem tego, że pomija wartości 10, 39 lub 47 - (które są odpowiednio \n
ewline, '
pojedynczym cudzysłowem i /
ukośnikiem dziesiętnym ASCII)
Rezultatem końcowym jest katalog zawierający wiele naprawdę brzydkich nazw plików zawierających każdy bajt w moim zestawie znaków od 1 do 255, z wyjątkiem pojedynczego cudzysłowu (pomijanego tylko w celu uniknięcia jeszcze jednej sed s///
instrukcji) i /
ukośnika. Te nazwy plików wyglądają tak:
(set -- *; printf '%s\n\n##############\n\n%s\n' "${9}" "${34}") | cat -A
---___ww -_ ---___xx -_ ---___yy -_ ---___zz -_ ---___{{ -_ ---___|| -_ ---$
$
___}} -_ ---___~~ -_ ---___^?^? -_ ---___M-^@M-^@ -_ ---___M-^AM-^A -_ ---___M-^BM-^B -_ ---___M-^CM-^C$
$
##############$
$
-_ ---___M-ZM-Z -_ ---___M-[M-[ -_ ---___M-\M-\ -_ ---___M-]M-] -_ ---___M-^M-^ -_ ---___M-_M-_ -_$
$
---___M-`M-` -_ ---___M-aM-a -_ ---___M-bM-b -_ ---___M-cM-c -_ ---___M-dM-d -_ ---___M-eM-e -_ ---___$
Teraz uzyskam trochę danych na temat tych plików:
chksqz() ( LC_ALL=C sqz=$1
set -- * ; set -f ; IFS= ; tc="$*"
printf '#%s\n' \
"There are $# files in this test directory." \
"All filenames combined contain a total of ${#tc} bytes."
IFS=$sqz ; set -- $* ; IFS= ; sc="$*"
printf "%s '$sqz'" \
"#Of which ${#sc} bytes are not"\
" and $((${#tc}-${#sc})) bytes are"
set +f ; unset IFS
printf ".\n#%s\n#Total:\t%d\n#Other:\t%d\n#'$sqz':\t%d\n" \
"And to confirm these figures:" \
$( printf %s * | wc -c
printf %s * | tr -d "$sqz" | wc -c
printf %s * | tr -dc "$sqz" | wc -c
))
chksqz '_ -'
WYNIK
#There are 101 files in this test directory.
#All filenames combined contain a total of 17744 bytes.
#Of which 2692 bytes are not '_ -' and 15052 bytes are '_ -'.
#And to confirm these figures:
#Total: 17744
#Other: 2692
#'_ -': 15052
Ok. Teraz wreszcie do działania:
ifsqz '_ -'
chksqz '_ -'
WYNIK
#There are 101 files in this test directory.
#All filenames combined contain a total of 2692 bytes.
#Of which 2692 bytes are not '_ -' and 0 bytes are '_ -'.
#And to confirm these figures:
#Total: 2692
#Other: 2692
#'_ -': 0
Sukces! Możesz przekonać się sam:
ls
????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
???????????????????????????
???????????????????????????
???????????????????????????
????????????????????????????
????????????????????????????
????????????????
??????????????????????
????????????????????????
??????????????????????????
??????????????????????????
??????????????????????????
??????????????????????????
???????????????????????????
???????????????????????????
???????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
??????????????????????????
????????????????????????
????????????????????
??????????????????
????????????????????????????
??
????????????????????????????
??????????????????????????
????????????????????????????
????????????????????????????
????????????????????!!""##
??????????????????!!""##$$
????????????????!!""##$$%%
????????????!!""##$$%%&&((
????????!!""??##$$%%&&(())
$$%%&&(())**??++,,..0011
%%&&(())**++??,,..00112233
&&(())**++,,??..0011223344
))**++,,..??0011223344556
**++,,..00??11223344556677
22334455667788??99::;;<<==>>
445566778899??::;;<<==>>??@@
5566778899::;;??<<==>>??@@AA
6778899::;;<<??==>>??@@AABB
8899::;;<<==??>>??@@AABBCCDD
\\]]^^``aa??bbccddeeffgghh
]]^^``aabbc??cddeeffgghhii
^^``aabbccdd??eeffgghhiijj
??@@AABBCCDDEE??FFGGHHIIJJKK
AABBCCDDEEFF??GGHHIIJJKKLLM
BBCCDDEEFFGG??HHIIJJKKLLMMNN
CCDDEEFFGGHHII??JJKKLLMMNNOO
EEFFGGHHIIJJ??KKLLMMNNOOPPQQ
ffgghhiijjkk??llmmnnooppqqrr
gghhiijjkkllmm??nnooppqqrrss
iijjkkllmmnn??ooppqqrrsstt
jjkkllmmnnoo??ppqqrrssttuuvv
kkllmmnnooppqq??rrssttuuvvww
LLMMNNOOPPQQRR??SSTTUUVVWWXX
MNNOOPPQQRRSS??TTUUVVWWXXYY
OOPPQQRRSSTT??UUVVWWXXYYZZ[[
PPQQRRSSTTUUVV??WWXXYYZZ[[\\
RRSSTTUUVVWW??XXYYZZ[[\\]]
ssttuuvvwwxx??yyzz{{||}}~~??
ttuuvvwwxxyyz??z{{||}}~~????
uuvvwwxxyyzz{{??||}}~~??????
wwxxyyzz{{||??}}~~??????????
xxyyzz{{||}}~~??????????????
YYZZ[[\\]]^^??``aabbccddee
ZZ[[\\]]^^``??aabbccddeeff