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 mvwywołanie na plik, a więc prawdopodobnie renamelepiej. Chociaż powinno działać podane tylko POSIX mvw $PATHi 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 $IFSodrobiną (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 \nznakach 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
#CGENNieco chociaż ... no, krótko ...
na dole printfwydrukowano 252 0s
następny od ostatniego otrzymuje 252 ''argumentów o pustym łańcuchu i dla każdego wypisuje zawartość znaku $nnastępującego po nim" $i "
evalinterpretuje argumenty następnego printfprzed wydrukowaniem wyników tej interpretacji jako liczby ósemkowe poprzedzone 2 ukośnikami odwrotnymi
ostatni printfwypisuje wartości bajtów dla tych liczb ósemkowych naraz, po których następuje łańcuch -_ ---___dla każdej pary
$njest inicjowany do równania, które będzie zwiększane $io jeden dla każdej oceny, z wyjątkiem tego, że pomija wartości 10, 39 lub 47 - (które są odpowiednio \newline, '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