Как переместить файлы в подкаталог на основе текстового файла
У меня есть каталог с около 2000 файлов в нем.
~/
-File 1.pdf
-File2.pdf
-Another file 1.pdf
-File3.pdf
-Someother file.docx
-Yeanother.pdf
Я сопоставил каждый файл с учетной записью, к которой он относится. Это отображение в файле CSV.
Имя файла и назначение
File 1.pdf | CompanyAccount1
File2.pdf | CompanyAccount1
Another file 1.pdf | CompanyAcountA
File3.pdf | CompanyAccount5
Someother file.docx | AnotherAccount2
Yeanother.pdf | CompanyAccount1
Я хотел бы переместить файлы из основного каталога в подкаталоги на основе имени учетной записи на основе CSV (или текстового файла).
Желаемый результат
~/
-CompanyAccount1
--File 1.pdf
--File2.pdf
--Yeanother.pdf
-CompanyAcountA
--Another file 1.pdf
-CompanyAccount5
--File3.pdf
-AnotherAccount2
--Someother file.docx
В идеале это было бы так просто mv < file-and-destination.csv
, но я не могу заставить его работать. я пробовал xargs mv < renaming.txt
, но это не работает, как ожидалось (некоторые были перемещены, а затем все остальное было перемещено в один каталог).
2 ответа
Проверь это:
#!/bin/bash
while IFS=" " read -r a b; do
mkdir -p "$b"
mv "$a" "${b}/"
done < file.csv
Создайте каталоги:
cut -f2 file-and-destination.csv |
xargs mkdir -p
Это предполагает, что текст разделен табуляцией, и что никакие имена файлов не содержат вкладку.
Если ни одно из имен файлов не содержит пробелов, вы можете просто xargs -n 2 mv <file-and-destination.csv
но так оно и есть сейчас (при условии, что ваш образец является представительным), простой while IFS=$'\t' read -r file dir
петля, кажется, путь.
while IFS=$'\t' read -r file dir; do
mv "$file" "$dir"
done <file-and-destination.csv
Другим решением является создание сценария для создания каталогов и перемещения файлов. Предполагается, что имена файлов с одинарными кавычками отсутствуют;
sed $'s/\\([^\t]*\\)\t\\(.*\\)/mkdir -p \'\\2\'; mv \'\\1\' \'\\2\''
Это просто генерирует команды; труба к sh
если результат выглядит разумным.
Я использую Bash "C-style strings $'...'
во всем как удобство. Если у вас нет Bash, второй, в частности, потребует некоторого рефакторинга. Во-первых, вы должны иметь возможность просто отбросить знак доллара и ввести буквенную вкладку между одинарными кавычками (во многих оболочках вкладкаcontrol- v позволяет получить буквенный символ табуляции в командной строке).
В общем, я бы не рекомендовал последний метод. Если у вас есть контроль над форматом входного файла, просто поместив destdir/file
чтобы сказать это file
следует переместить в destdir
может быть лучше дизайн (потому что разделение на косой черты легко и естественно, и теперь вы также можете иметь имена файлов с вкладками).