LINUX.ORG.RU

bash, переименование файлов, пробелы, двоеточие

 ,


0

1

Вопрос решён: В именах файлов не двоеточие, а Fullwidth Colon - : Прошу прощения у всех за потраченное вами время

Доброго дня.

Возможно ли такое:

for f in *; do cp "$f" "${f/пробел/пробел пробел двоеточие пробел/}" ; done

# или же

for f in *; do cp "$f" "$(echo "$f" | sed s/пробел пробел двоеточие пробел/пробел/}" ; done


Последнее исправление: vrnd (всего исправлений: 5)
Ответ на: комментарий от Entmatix

А что из ОП-поста не ясно? Он хочет сделать очередной всратый однострочник на Bash, который сразу сломается и скопирует файлы неправильно.

EXL ★★★★★
()

Есть утилита rename, написанная на perl (в разных дистрибутивах по разному называется). Регулярка будет типа такой: s/[ :]+/-/g. Заменит все пробелы и двоЕточия на типа тире (минус) (kebab-case)

uwuwuu
()
Последнее исправление: uwuwuu (всего исправлений: 1)

У тебя пробелы разделителями выступают, потому имена с пробелами делятся на отдельные вхождения.

#!/bin/sh

IFS='
' # Да, это ньюлайн!

for f in $(find ./ -mindepth 1 -maxdepth 1 -print); do
  new_f="$(echo "${f}" | tr '  : ' ' ')"
  cp "${f}" "${new_f}"
done
mord0d ★★★★★
()

Меня горький опыт с башем научил теперь писать find ... | while read -r f do; echo cp "$f"; done. Те читаем имена файлов построчно

Пробелы с юниксе - зло. Но юзеры привыкли к пробелам вместо - или _. И оттого все проблемы баша.

PS. Можно как то в баше разделитель полей сделать не пробел или таб а перевод строки или \0? Это бы глобально решило проблему.

bga_ ★★★★
()
Ответ на: комментарий от mord0d

вопрос ведь не в том: просто перебор делать или использовать find, добавлять переменные или ещё какие-либо изощрения. Вопрос в том как скормить bash следующую последовательность:

'  : '
vrnd
() автор топика
Ответ на: комментарий от vrnd

как это обратная?

0 $ touch 'aaa  : bbb1'
0 $ touch 'aaa  : bbb2'
0 $ ls -l
итого 0
-rw-rw-r-- 1 u1 u1 0 мая  7 22:35 'aaa  : bbb1'
-rw-rw-r-- 1 u1 u1 0 мая  7 22:35 'aaa  : bbb2'
0 $ for f in *; do cp -- "$f" "$f : trololo"; done
0 $ ls -l
итого 0
-rw-rw-r-- 1 u1 u1 0 мая  7 22:35 'aaa  : bbb1'
-rw-rw-r-- 1 u1 u1 0 мая  7 22:35 'aaa  : bbb1 : trololo'
-rw-rw-r-- 1 u1 u1 0 мая  7 22:35 'aaa  : bbb2'
-rw-rw-r-- 1 u1 u1 0 мая  7 22:35 'aaa  : bbb2 : trololo'
0 $ 

superuser ★★★★☆
()
Ответ на: комментарий от vrnd

результат тот же

Вы пример названия файла приведите, у меня все работает:

$ ls -1
'123  : 456.txt'
'789  : 012.txt'

$ for f in *; do cp "$f" "$(echo "$f" | sed -E 's/\s\s:\s/ /')" ; done

$ ls -1
'123  : 456.txt'
'123 456.txt'
'789  : 012.txt'
'789 012.txt'
dmitry237 ★★★★
()
Ответ на: комментарий от vrnd
0 $ touch 'aaa  : bbb1'
0 $ touch 'aaa  : bbb2'
0 $ ls -l
итого 0
-rw-rw-r-- 1 u1 u1 0 мая  8 00:44 'aaa  : bbb1'
-rw-rw-r-- 1 u1 u1 0 мая  8 00:44 'aaa  : bbb2'
0 $ for f in *; do cp -- "$f" "$(echo "$f" | sed 's|  : | |')"; done
0 $ ls -l
итого 0
-rw-rw-r-- 1 u1 u1 0 мая  8 00:44 'aaa  : bbb1'
-rw-rw-r-- 1 u1 u1 0 мая  8 00:45 'aaa bbb1'
-rw-rw-r-- 1 u1 u1 0 мая  8 00:44 'aaa  : bbb2'
-rw-rw-r-- 1 u1 u1 0 мая  8 00:45 'aaa bbb2'
0 $ 
superuser ★★★★☆
()
Ответ на: комментарий от vrnd

Прежде чем что-то сложное запускать как есть сначала запусти но в начало команд припиши echo. Те cp "$f" в echo cp "$f". Если результат устроит то echo убирай

bga_ ★★★★
()
Ответ на: комментарий от vrnd

s/[<сюда вписываешь все символы, запрещенные для имен файлов в Шindows>]+/_/g, а точнее 's/[\\/:*?"<>|]+/_/g'. НЕ советую их заменять на пробелы лучше подчеркивания или тире (хотя последнее для папочек). Меня просто бесит когда имена переносятся через жопу либо обрезаются, да и в терминал неудобно вставлять, надо в кавычки оборачивать либо слеши вставлять

uwuwuu
()