для соответствия шаблону без учета регистра в условии if

mv parentFolder/* parentFolder/..

Будут перемещены все (не -скрытые )файлы, а не только файлы типа каталог .

Для перемещения только каталогов сzsh(также сокращением кода)

(){mv $1/{*(/),..} && rm -rf $1} parentFolder

Или включить скрытые:

(){mv $1/{*(D/),..} && rm -rf $1} parentFolder
  • (){..$1..} arg:анонимная функция с аргументом (для факторизацииparentFolder)
  • {a,b}csh -раскрытие фигурной скобки, также для разложения на множители
  • (/):квалификатор glob для выбора только каталогов. Вы также можете сделать */(, что также будет работать в bash, но также будет включать символические ссылки на каталоги ).
  • (D/):Dдля точечных -файлов (скрытых файлов, имя которых начинается с.).
0
21.06.2021, 21:28
1 ответ

Если вы используете Bash, вы можете использовать расширение ${var,,}, чтобы перевести $varв нижний регистр:

V1=foO V2=Foo
if [[ "${V1,,}" == "${V2,,}" ]]; then
    printf '%s\n' "'$V1' and '$V2' are the same in lowercase";
fi

или используйтеnocasematch:

shopt -s nocasematch
V1=foO V2=Foo
if [[ "$V1" == "$V2" ]]; then
    printf '%s\n' "'$V1' and '$V2' are the same apart from case" ;
fi

Хотя я не уверен, что любой из них хорошо работает с буквами, отличными от ASCII. В общем, проблема сравнения верхнего и нижнего регистра и нечувствительного к регистру -сопоставления немного запутана, а также зависит от локали (турецкого с точками и без точек i , что является обычным примером ). Но если все, что у вас есть, это буквы от A до Z без диакритических знаков и локаль, совместимая с английским -, или набор LC_ALL=C, это должно сработать.


В Zsh и с включенной опцией extendedglobвы можете использовать (#i)$V2справа:

setopt extendedglob
V1=foO V2=Foo
if [[ "$V1" == (#i)"$V2" ]]; then
    printf '%s\n' "'$V1' and '$V2' are the same apart from case" ;
fi
3
28.07.2021, 11:23

Теги

Похожие вопросы