有4个用户文件夹user1, user2, user3和user4
它们的文件夹中都有音乐,我需要将。mp4,。mkv和。mp3文件移动到/tmp/Papierkorb文件夹
我还需要重命名它,比如,当user1有一个音乐文件时,它应该将文件的名称更改为user_filename的名称,它来自哪个用户。
这是我现在的文件:
for file in $(find -type f -name *.mp3;find -type f -name *.mkv;find -type f -name *.mp4)
do
echo mv "$file" /tmp/Papierkorb$file;
done
这是echo的结果:
root@ubuntu-VirtualBox:/home# bash script.sh
mv ./user2/music/hits.mp3 /tmp/Papierkorb./user2/music/hits.mp3
mv ./user4/hits/music.mp3 /tmp/Papierkorb./user4/hits/music.mp3
mv ./user1/lied1.mp3 /tmp/Papierkorb./user1/lied1.mp3
mv ./user1/lied1.mkv /tmp/Papierkorb./user1/lied1.mkv
mv ./user1/lied12.mp4 /tmp/Papierkorb./user1/lied12.mp4
mv ./user1/1lied12.mp4 /tmp/Papierkorb./user1/1lied12.mp4
mv ./user3/test/meinealben/testlied.mp4 /tmp/Papierkorb./user3/test/meinealben/testlied.mp4
当我删除回显时,它说,Papierkorb之后的文件夹不存在。我也不知道如何将其重命名为用户名,即文件来自哪个用户。
对于find
,您可以将-name
谓词分组并使用-exec ... {} +
构造:
for user in user1 user2 user3 user4
do
find "./$user" '(' -name '*.[mM][pP][34]' -o -name '*.[mM][kK][vV]' ')' -exec sh -c '
for file
do
mv "$file" "$0${file##*/}"
done
' "/tmp/Papierkorb/${user}_" {} +
done
指出:
- 为了使代码更简单,我为每个用户名 使用了一个
- 的
-exec sh -c '...' "/tmp/Papierkorb/${user}_" {} +
是有点hackish,但由于这一点,你将直接有/tmp/Papierkorb/${user}_
的值作为$0
在内联脚本
find
使用find和awk
#!/bin/bash
dir="/path/to/users"
# for all users
find "$dir" -maxdepth 2 -regex '.*.([mM][pP][34]|[mM][kK][vV])'|
awk -F/ '{print |"mv "$0" /tmp/Papierkorb/"$(NF-1)"_"$NF}'
# for some users
# using multiple find folders
find "$dir"/user1 "$dir"/user2 "$dir"/user3 -maxdepth 2 -regex '.*.([mM][pP][34]|[mM][kK][vV])'|
awk -F/ '{print |"mv "$0" /tmp/Papierkorb/"$(NF-1)"_"$NF}'
# using awk user filter
find "$dir" -maxdepth 2 -regex '.*.([mM][pP][34]|[mM][kK][vV])'|
awk -F/ '/user1|user2|user3/ {print |"mv "$0" /tmp/Papierkorb/"$(NF-1)"_"$NF}'
# using awk condition
find "$dir" -maxdepth 2 -regex '.*.([mM][pP][34]|[mM][kK][vV])'|
awk -F/ '{if($(NF-1)=="user1" || $(NF-1)=="user2" print |"mv "$0" /tmp/Papierkorb/"$(NF-1)"_"$NF}'
使用find和xargs
find "$dir"/user1 "$dir"/user2 -maxdepth 2 -regex '.*.([mM][pP][3-4]|[mM][kK][vV])'|
xargs -i sh -c 'mv "{}" /tmp/Papierkorb/$(basename $(dirname "{}"))_$(basename "{}")'