1

Я сделал скрипт на Python для анализа большого объема некоторых данных и сохранения результатов, которые в результате дали ~ 162 файла. Сценарий назвал эти файлы Parsed_NameOfOriginal\n . Обратите внимание на \n в конце, который не был предназначен, но каким-то образом был добавлен моим сценарием. Поскольку для получения этих результатов потребовалось много часов, я не хочу снова запускать исправленный скрипт.

Есть ли способ использовать терминал Linux или сценарий оболочки, чтобы переименовать каждый файл в каталоге с таким же именем, но обрезать его \n в конце?

Т.е. Parsed_ResultA\n становится Parsed_ResultA .

Примечание: добавлен новый символ строки , а не текстовый \n

3 ответа3

4

Это должно работать:

for f in *$'\n'; do mv -i "$f" "${f%$'\n'}"; done
  • *$'\n' расширяется до всех имен файлов, заканчивающихся символом новой строки.

  • Цикл for проходит через все соответствующие файлы, сохраняя имя файла в переменной f.

  • ${f%$'\n'} удаляет завершающий символ новой строки из имени файла, хранящегося в f.

  • mv -i переименовывает файл, предлагая перезаписать что-либо.

0

Вы можете использовать perl renamer из пакета debian libfile-rename-perl:

rename 's/\n//' Parsed_Result*

Поскольку существует несколько вариантов rename , сделайте резервную копию ваших файлов раньше.

0

ОК, хорошо, мой новый вариант:

$ touch boo$'\n'
$ touch foo$'\n'
$ ls -l
total 4
-rw-r--r-- 1 user user 54 Feb  9 12:16 111.sh
-rw-r--r-- 1 user user  0 Feb  9 12:17 boo?
-rw-r--r-- 1 user user  0 Feb  9 12:17 foo?
$ sh 111.sh 
$ ls -l
total 4
-rw-r--r-- 1 user user 54 Feb  9 12:16 111.sh
-rw-r--r-- 1 user user  0 Feb  9 12:17 boo
-rw-r--r-- 1 user user  0 Feb  9 12:17 foo
$ cat 111.sh 
for i in `find ./ -name '*
'`
do
  mv $i$'\n' $i
done
$

Старый вариант (неправильный):

Используйте:

find ./ -name "*\n" | sed 's/\(.*\)\\n/mv \1\\\\n\ \1/'

создать список команд переименования. А затем просто скопируйте / вставьте все эти команды в терминал. Пример:

$ touch 111\\n
$ touch 222\\n
$ ls -l
total 0
-rw-r--r-- 1 user user 0 Feb  9 11:15 111\n
-rw-r--r-- 1 user user 0 Feb  9 11:15 222\n
$ find ./ -name "*\n" | sed 's/\(.*\)\\n/mv \1\\\\n\ \1/'
mv ./111\\n ./111
mv ./222\\n ./222
$ mv ./111\\n ./111
$ mv ./222\\n ./222
$ ls -l
total 0
-rw-r--r-- 1 user user 0 Feb  9 11:15 111 
-rw-r--r-- 1 user user 0 Feb  9 11:15 222 
$   

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .