Я хотел бы объединить содержимое этих папок с помощью командной строки.
.
├── folder1
│ │ file.txt
│
├── folder2
│ │ file.txt
│
└───folder3
│ file.txt
Как я могу это сделать ?
решение1
Наконец-то я могу это сделать с помощью cp
и его--backup
флаг.
cp --backup=numbered */*.txt new_directory/
решение2
Следующий цикл командной строки скопирует содержимое (верхнего уровня) каждой папки с именем "folder*" в текущем каталоге в каталог с именем "new_directory". /*
По умолчанию glob не будет соответствовать "dot files"; используйте, shopt -s dotglob
если хотите изменить это поведение. Если такое же (базовое) имя файла уже существует в new_directory, то он добавляет к файлу назначения префикс исходной папки (и подчеркивание), чтобы сделать его уникальным.
Все в одной строке:
for f in folder*/*; do [ ! -e "new_directory/$(basename "$f")" ] && { cp "$f" new_directory/; continue; }; [ -e "new_directory/$(basename "$f")" ] && cp "$f" "new_directory/$(dirname "$f")_$(basename "$f")"; done
Разбито для удобства чтения:
for f in folder*/*
do
[ ! -e "new_directory/$(basename "$f")" ] && { cp "$f" new_directory/; continue; }
[ -e "new_directory/$(basename "$f")" ] && cp "$f" "new_directory/$(dirname "$f")_$(basename "$f")"
done
Если вы намерены вместо этогодвигатьсяфайлы из их исходных местоположений, просто замените cp
«s» на mv
«s».