Как переместить файлы в подкаталог на основе текстового файла

У меня есть каталог с около 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 может быть лучше дизайн (потому что разделение на косой черты легко и естественно, и теперь вы также можете иметь имена файлов с вкладками).

Другие вопросы по тегам