У меня есть каталог users
, полный папок, названных по имени каждого пользователя. Внутри этих папок есть файл с именем , userinfo.csv
который я хотел бы вытащить из папки и поместить в users
. Поскольку каждый файл в папке пользователя называется userInfo, я хочу переименовать его, включив в него имя пользователя, которое находится в папке. Я попробовал следующее, но это не работает, потому что имя пользователя в $dir
— это полный каталог. Я не так уж привязан к переименованию его в имя пользователя, мне просто нужно переименовать его как-то так, чтобы при перемещении в users
я не остался только с одним файлом и кучей ошибок.
Как я могу это улучшить?
# for every subdirectory, copy userinfo.csv to /users and rename to avoid confusion/errors
for dir in /path/to/users/*/; do
(
cd "$dir" && cp userinfo.csv _$("dir").csv && cp _$("dir").csv /path/to/users/
)
done
решение1
Если вам не нужно имя пользователя в конечном имени файла,
for i in /path/to/users/*/userinfo.csv ; do
mv $i /path/to/users/userinfo-$RANDOM.csv
done
сделать трюк для вашего варианта использования?
Если нет, вы также можете использовать подстановку параметров bash:
for i in /path/to/users/*/userinfo.csv ; do
mv $i /path/to/users/${i//\/-}
done
Это заменит все /
на -
в переменной $i
(путь+имя файла). Так что в итоге получится, например:
/path/to/users/path-to-users-john-userinfo.csv
/path/to/users/path-to-users-jack-userinfo.csv
решение2
for i in $(ls -1 /path/to/users/); do
mv /path/to/users/$i/*/userinfo.csv /path/to/users/userinfo_$i.csv
done
Это будет работать, если userinfo.csv
местоположение — /path/to/users/$user/userinfo.csv
. В случаях, когда /path/to/users/
содержит папки без файлов userinfo.csv
или только файлы, mv
ничего не будет делать и, следовательно, может быть проигнорировано.
В $i
этом случае будет содержаться имя каждого элемента, /path/to/users/
будь то файл или папка.