В Vim можно также просто сделать глобальную замену на запуске всех строк:
:%s/^/;/
Я использовал бы find
для получения имен папок проанализируйте их с sed
, grep соответствующий идентификатор и копия наполняют:
$ find . -mindepth 1 -type d | while read dir; do
id=$(echo "$dir" | sed 's/\.\/[[:alpha:]]*\([[:digit:]]*\)_[[:alnum:]]*/\1/');
new_name=$(grep -w "$id" names.csv | cut -d ';' -f 1);
mkdir -p "$new_name" && mv -rv "$dir"/* "$new_name"/ && rmdir "$dir";
done
Приемы
mkdir -p
который создаст каталог и выйдет тихо, если он будет существовать. grep -w
на файле CSV, чтобы только получить те строки, которые содержат весь идентификатор, ограниченный несловесными символами. Тем путем Вы стараетесь не соответствовать обоим 1123
и 123
для идентификатора 123
. Принятие Ваших каталогов является всеми в соответствии с текущим рабочим каталогом, вот начальная точка (так протестируйте его прежде, чем работать в напоминании):
csvFile="/tmp/file.csv"
for d in ./*;
# only work with directory
[[ ! -d "$d" ] && continue
# extract id from directory
id="$(echo "$d" | sed 's/[[:alpha:]]*\([[:digit:]]*\)_[[:alnum:]]*/\1/')"
# fetch new name
nid="$(awk -F';' '/'"$id"'/ {print $1}' "$csvFile")"
# merge all matching dir into one
mv "$d" "$nid"
done
Сделал Вы смотрите на:
gawk
будет соответствовать любым строкам, содержащим идентификатор, не только тех, которые имеют определенный идентификатор. Это будет соответствовать обоим foo123
и 123bar
для идентификатора 123, например. Это также создаст подкаталоги вместо того, чтобы копировать файлы для второй папки с тем же целевым идентификатором.
– terdon♦
04.01.2014, 17:17
rmdir
перестал бы работать, поскольку каталог не пуст, Возможноmv -v "$dir"/* "$new_name"/
? Также потребность быть осторожными Вы не требуете.
файлы из базового каталога при копировании/перемещении с*
шарик. Идея № 2 – Matt 04.01.2014, 19:09