Переименование + перемещение вложенных файлов в скрипте Bash

Переименование + перемещение вложенных файлов в скрипте Bash

У меня есть каталог 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/будь то файл или папка.

Связанный контент