Как перенести только один .csv файл из одной папки в другую, переименовав его?

Как перенести только один .csv файл из одной папки в другую, переименовав его?

02.09.2015 11:09:53 Просмотров 15 Источник

Есть задача найти в текущем каталоге файл с расширением .csv и перенести его в другой каталог. Надо учесть, что в исходном каталоге может быть сразу несколько таких файлов. В таком случае надо переносить только первый из них. В каталог назначения его надо сохранять под другим названием. Я попробовал написать нужный скрипт сам, но не знаю как в такой реализации получить имя файла для его перемещения:

if $name = ls *.csv; then
echo $name; else echo "ERROR"; fi;
У вопроса есть решение - Посмотреть?

Ответы - Как перенести только один .csv файл из одной папки в другую, переименовав его? / Как перенести только один .csv файл из одной папки в другую, переименовав его?

Является ответом!
kostap

02.09.2015 11:45:36

#!/bin/bash

cd /usr/local/plot_lin/src/
find * -name "*.csv" -type f |
if read file
then
  echo "$file"
  mv $file "new_file_name.csv"
else
  echo "No files"
fi

Попробуй вот этот код /usr/local/plot_lin/src/ - папка поиска

https://ru.stackoverflow.com/questions/446635/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b5%d1%80%d0%b5%d0%bd%d0%b5%d1%81%d1%82%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%be%d0%b4%d0%b8%d0%bd-csv-%d1%84%d0%b0%d0%b9%d0%bb-%d0%b8%d0%b7-%d0%be%d0%b4%d0%bd%d0%be%d0%b9-%d0%bf%d0%b0%d0%bf%d0%ba%d0%b8-%d0%b2-%d0%b4%d1%80%d1%83%d0%b3%d1%83%d1%8e-%d0%bf%d0%b5%d1%80%d0%b5%d0%b8%d0%bc%d0%b5%d0%bd%d0%be%d0%b2%d0%b0%d0%b2-%d0%b5%d0%b3%d0%be/446650#comment473676_446650
надеюсь, вы в курсе, что find по умолчанию не производит никакой сортировки вывода, и «первый файл» с точки зрения человека может быть далеко не первым в выдаче предложенного вами скрипта.
https://ru.stackoverflow.com/questions/446635/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b5%d1%80%d0%b5%d0%bd%d0%b5%d1%81%d1%82%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%be%d0%b4%d0%b8%d0%bd-csv-%d1%84%d0%b0%d0%b9%d0%bb-%d0%b8%d0%b7-%d0%be%d0%b4%d0%bd%d0%be%d0%b9-%d0%bf%d0%b0%d0%bf%d0%ba%d0%b8-%d0%b2-%d0%b4%d1%80%d1%83%d0%b3%d1%83%d1%8e-%d0%bf%d0%b5%d1%80%d0%b5%d0%b8%d0%bc%d0%b5%d0%bd%d0%be%d0%b2%d0%b0%d0%b2-%d0%b5%d0%b3%d0%be/446650#comment473983_446650
Не спорю, но не было сказано как сортировать и нужно ли.
https://ru.stackoverflow.com/questions/446635/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b5%d1%80%d0%b5%d0%bd%d0%b5%d1%81%d1%82%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%be%d0%b4%d0%b8%d0%bd-csv-%d1%84%d0%b0%d0%b9%d0%bb-%d0%b8%d0%b7-%d0%be%d0%b4%d0%bd%d0%be%d0%b9-%d0%bf%d0%b0%d0%bf%d0%ba%d0%b8-%d0%b2-%d0%b4%d1%80%d1%83%d0%b3%d1%83%d1%8e-%d0%bf%d0%b5%d1%80%d0%b5%d0%b8%d0%bc%d0%b5%d0%bd%d0%be%d0%b2%d0%b0%d0%b2-%d0%b5%d0%b3%d0%be/446650#comment474005_446650
явно сказано не было. но приведён пример: ls *.csv. который, понятно, возвращает отсортированный список файлов.
https://ru.stackoverflow.com/questions/446635/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b5%d1%80%d0%b5%d0%bd%d0%b5%d1%81%d1%82%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%be%d0%b4%d0%b8%d0%bd-csv-%d1%84%d0%b0%d0%b9%d0%bb-%d0%b8%d0%b7-%d0%be%d0%b4%d0%bd%d0%be%d0%b9-%d0%bf%d0%b0%d0%bf%d0%ba%d0%b8-%d0%b2-%d0%b4%d1%80%d1%83%d0%b3%d1%83%d1%8e-%d0%bf%d0%b5%d1%80%d0%b5%d0%b8%d0%bc%d0%b5%d0%bd%d0%be%d0%b2%d0%b0%d0%b2-%d0%b5%d0%b3%d0%be/446650#comment944923_446650
@alexanderbarakin TIL ls сортирует её вывод по алфавиту (чтобы это не значило) по умолчанию (как и задокументировано). Как известно очевидных интерфейсов не бывает — всему приходится учиться ("There is no intuitive interface, not even the nipple. It's all learned."). К примеру, порядок os.listdir() вывода в Питоне (и соответствующих системных интерфейсов, на которых она реализована) не гарантирован.
aleksandr barakin

02.09.2015 12:10:48

люблю однострочники.

$ ls *.csv | head -n 1 | xargs -I{} mv {} /новое.место/новое.имя
https://ru.stackoverflow.com/questions/446635/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b5%d1%80%d0%b5%d0%bd%d0%b5%d1%81%d1%82%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%be%d0%b4%d0%b8%d0%bd-csv-%d1%84%d0%b0%d0%b9%d0%bb-%d0%b8%d0%b7-%d0%be%d0%b4%d0%bd%d0%be%d0%b9-%d0%bf%d0%b0%d0%bf%d0%ba%d0%b8-%d0%b2-%d0%b4%d1%80%d1%83%d0%b3%d1%83%d1%8e-%d0%bf%d0%b5%d1%80%d0%b5%d0%b8%d0%bc%d0%b5%d0%bd%d0%be%d0%b2%d0%b0%d0%b2-%d0%b5%d0%b3%d0%be/446657#comment473673_446657
Слишком сложно: mv -v `ls *.csv | head -n 1` /another/folder
https://ru.stackoverflow.com/questions/446635/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b5%d1%80%d0%b5%d0%bd%d0%b5%d1%81%d1%82%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%be%d0%b4%d0%b8%d0%bd-csv-%d1%84%d0%b0%d0%b9%d0%bb-%d0%b8%d0%b7-%d0%be%d0%b4%d0%bd%d0%be%d0%b9-%d0%bf%d0%b0%d0%bf%d0%ba%d0%b8-%d0%b2-%d0%b4%d1%80%d1%83%d0%b3%d1%83%d1%8e-%d0%bf%d0%b5%d1%80%d0%b5%d0%b8%d0%bc%d0%b5%d0%bd%d0%be%d0%b2%d0%b0%d0%b2-%d0%b5%d0%b3%d0%be/446657#comment473674_446657
@igumnov, тоже можно, хоть и теряется наглядность. и, естественно, без backtick-ов `: конструкция $(...) — входит в posix.
https://ru.stackoverflow.com/questions/446635/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b5%d1%80%d0%b5%d0%bd%d0%b5%d1%81%d1%82%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%be%d0%b4%d0%b8%d0%bd-csv-%d1%84%d0%b0%d0%b9%d0%bb-%d0%b8%d0%b7-%d0%be%d0%b4%d0%bd%d0%be%d0%b9-%d0%bf%d0%b0%d0%bf%d0%ba%d0%b8-%d0%b2-%d0%b4%d1%80%d1%83%d0%b3%d1%83%d1%8e-%d0%bf%d0%b5%d1%80%d0%b5%d0%b8%d0%bc%d0%b5%d0%bd%d0%be%d0%b2%d0%b0%d0%b2-%d0%b5%d0%b3%d0%be/446657#comment473679_446657
Или так (в переменной $name /новое.место/новое.имя) mv ls *.csv 2>/dev/null | head -1 $name >/dev/null 2>&1 || echo .csv files not found / блин, что за форматер? не могу вставить обратные кавычки перед ls и после -1
https://ru.stackoverflow.com/questions/446635/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b5%d1%80%d0%b5%d0%bd%d0%b5%d1%81%d1%82%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%be%d0%b4%d0%b8%d0%bd-csv-%d1%84%d0%b0%d0%b9%d0%bb-%d0%b8%d0%b7-%d0%be%d0%b4%d0%bd%d0%be%d0%b9-%d0%bf%d0%b0%d0%bf%d0%ba%d0%b8-%d0%b2-%d0%b4%d1%80%d1%83%d0%b3%d1%83%d1%8e-%d0%bf%d0%b5%d1%80%d0%b5%d0%b8%d0%bc%d0%b5%d0%bd%d0%be%d0%b2%d0%b0%d0%b2-%d0%b5%d0%b3%d0%be/446657#comment473680_446657
Еще можно на самом деле два символа выиграть если вместо head -n 1 просто head -1 писать.
https://ru.stackoverflow.com/questions/446635/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b5%d1%80%d0%b5%d0%bd%d0%b5%d1%81%d1%82%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%be%d0%b4%d0%b8%d0%bd-csv-%d1%84%d0%b0%d0%b9%d0%bb-%d0%b8%d0%b7-%d0%be%d0%b4%d0%bd%d0%be%d0%b9-%d0%bf%d0%b0%d0%bf%d0%ba%d0%b8-%d0%b2-%d0%b4%d1%80%d1%83%d0%b3%d1%83%d1%8e-%d0%bf%d0%b5%d1%80%d0%b5%d0%b8%d0%bc%d0%b5%d0%bd%d0%be%d0%b2%d0%b0%d0%b2-%d0%b5%d0%b3%d0%be/446657#comment473692_446657
@avp, используйте конструкцию $(...) вместо backtick-ов `. помимо большего удобства при вложенности конструкций, она вполне «переносима», так как входит в posix
https://ru.stackoverflow.com/questions/446635/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b5%d1%80%d0%b5%d0%bd%d0%b5%d1%81%d1%82%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%be%d0%b4%d0%b8%d0%bd-csv-%d1%84%d0%b0%d0%b9%d0%bb-%d0%b8%d0%b7-%d0%be%d0%b4%d0%bd%d0%be%d0%b9-%d0%bf%d0%b0%d0%bf%d0%ba%d0%b8-%d0%b2-%d0%b4%d1%80%d1%83%d0%b3%d1%83%d1%8e-%d0%bf%d0%b5%d1%80%d0%b5%d0%b8%d0%bc%d0%b5%d0%bd%d0%be%d0%b2%d0%b0%d0%b2-%d0%b5%d0%b3%d0%be/446657#comment473703_446657
Особенно в SO комментариях :)
https://ru.stackoverflow.com/questions/446635/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b5%d1%80%d0%b5%d0%bd%d0%b5%d1%81%d1%82%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%be%d0%b4%d0%b8%d0%bd-csv-%d1%84%d0%b0%d0%b9%d0%bb-%d0%b8%d0%b7-%d0%be%d0%b4%d0%bd%d0%be%d0%b9-%d0%bf%d0%b0%d0%bf%d0%ba%d0%b8-%d0%b2-%d0%b4%d1%80%d1%83%d0%b3%d1%83%d1%8e-%d0%bf%d0%b5%d1%80%d0%b5%d0%b8%d0%bc%d0%b5%d0%bd%d0%be%d0%b2%d0%b0%d0%b2-%d0%b5%d0%b3%d0%be/446657#comment473706_446657
@avp, в so-комментариях в таких случаях надо пользоваться backslash-ами: \`
https://ru.stackoverflow.com/questions/446635/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b5%d1%80%d0%b5%d0%bd%d0%b5%d1%81%d1%82%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%be%d0%b4%d0%b8%d0%bd-csv-%d1%84%d0%b0%d0%b9%d0%bb-%d0%b8%d0%b7-%d0%be%d0%b4%d0%bd%d0%be%d0%b9-%d0%bf%d0%b0%d0%bf%d0%ba%d0%b8-%d0%b2-%d0%b4%d1%80%d1%83%d0%b3%d1%83%d1%8e-%d0%bf%d0%b5%d1%80%d0%b5%d0%b8%d0%bc%d0%b5%d0%bd%d0%be%d0%b2%d0%b0%d0%b2-%d0%b5%d0%b3%d0%be/446657#comment473856_446657
Ну, да. $(...) замечательно вкладывается в backslash-ы
SkliF

07.09.2015 09:38:01

Если много файлов (например, ls или mv не может скушать список аргументов), то искать надо таким однострочником:

find /source/dir/ -name "*.csv" -print0 | head -1 | xargs -0 -I % mv % /target/dir/

xargs используем: для Linux (и Cygwin) с ключом -I, для FreeBSD/OS X с ключом -J, вместо знака % можно использовать любой символ/букву: find ... | xargs -I i mv i

Более того, используя find <...> -print0 | xargs -0 <command>, мы страхуемся на кривые имена файлов (если в имени файлов есть пробелы).

zombic

16.09.2015 12:53:08

ls /sourse_dir/ | grep -m1 .csv | xargs -I{} mv {} /target_dir/$RANDOM.csv

В таком варианте вне зависимости от наличия пробелов в имени файла он копируется в нужную директорию и переименовывается случайным образом ($RANDOM), не заменяя предыдущие уже скопированные файлы.

Закрыть X