Переименовать имена файлов, содержащие пробелы .ksh - PullRequest
0 голосов
/ 17 марта 2019

Я пытаюсь переименовать мои файлы, содержащие пробелы. IFS = $ '\ n' фактически работал, поскольку цикл FOR теперь может обрабатывать эти имена файлов с пробелами. К сожалению, все файлы .csv в DIR вставляются в переменную FL, что приводит к ошибке. Есть ли способ для переменной FL обрабатывать один файл за раз, в то время как он также обрабатывает интервал в имени файла?

сценарий:

IFS=$'\n'
for FL in `ls -1 ${DIR}/*.csv`
do
FL_DP=`echo ${FL}`
FL_RN=`echo ${FL_DP} | tr -d '[:blank:]'`
mv ${FL_DP} ${FL_RN}
done

Результат:

+ IFS=$\n
+ ls -1 test _1.csv test _2.csv
++ echo test _1.csv
test _2.csv
FL_DP=test _1.csv
test _2.csv
++ echo test _1.csv
test _2.csv
FL_RN=test_1.csv
test_2.csv
+ mv test _1.csv
test _2.csv test_1.csv
test_2.csv
mv: cannot access test _1.csv
test _2.csv

Ожидаемый результат:

+ ls -1 test _1.csv test _2.csv
++ echo test _1.csv
FL_DP=test _1.csv
++ echo test _1.csv
FL_RN=test_1.csv
mv test _1.csv test_1.csv

Ответы [ 4 ]

1 голос
/ 17 марта 2019

Возможно, вам просто нужно заключить переменную в кавычки.Но у @Cyrus есть хороший момент для анализа вывода ls.Хотя это и заманчиво, его следует рассматривать как удобочитаемые данные.

Вот как вы могли бы сделать это без ls:

for f in "$dir"/*.csv; do mv -i "$dir/$f" "$dir/${f// /}"; done
0 голосов
/ 19 марта 2019

Вы можете найти команды find и awk

find . -name "*.csv" -printf "mv \"%f\" |\"%f\" \n" | awk  -F"|" ' { gsub(" ","",$2); print } '

Пример тестирования

$ ls -1 *csv
scores.csv
'test _1.csv'
'test _2.csv'
$ find . -name "*.csv" -printf "mv \"%f\" |\"%f\" \n" | awk  -F"|" ' { gsub(" ","",$2); print } '
mv "scores.csv"  "scores.csv"
mv "test _1.csv"  "test_1.csv"
mv "test _2.csv"  "test_2.csv"
$

Здесь printf печатает имя файла, используя идентификатор% f, просто добавьте канали напечатайте имя файла 2 раза.

Я использовал трубу здесь, потому что это не будет отображаться в имени файла.Теперь передайте результаты в команду awk с помощью «|»в качестве разделителя и замените пробелы, используя функцию gsub ().

Окончательные результаты можно снова передать ksh для их выполнения

Надеюсь, это поможет

0 голосов
/ 17 марта 2019

Вот пример использования find, while и read:

find . -type f | while
  read filename
do
  echo "$filename"
done

Вот как вы можете применить вышеуказанную конструкцию к вашему конкретному вопросу:

find $DIR -name '*.csv' -type f | while
  read filename
do
  mv "$filename" ${filename/ /}
done
0 голосов
/ 17 марта 2019

Изменить с `backticks` на "quotes" в FL_DP

Не разбирайте ls, просто используйте for file in dirname..

IFS=$'\n'
for FL in {DIR}/*.csv
do
  FL_DP="${FL}"
  FL_RN=`echo ${FL_DP} | tr -d '[:blank:]'`
  mv ${FL_DP} ${FL_RN}
done
...