我想将目录移动到另一个位置并按首字母移动到子目录中。例如: ./alpha 将移动到 /otherdir/a/ ./beta 将移动到 /otherdir/b/ 所有子目录都已创建,并且它是一个固定集,因此我不需要担心检查或创建这些子目录。我希望使用 的输出
find . -type d -name "[a-z*]"
,当我运行 时
find . -type d -name "[a-z*]" | xargs mv -t /dest/
,所有目录都会被移动,但当然不会移动到子目录中。我不知道是否可以使用组件的第二个参数/dest/first character here/
,传递每个目录名称的第一个字符。有没有办法做到这一点,或者有不同的方法来a)生成目录列表和b)将目录名称和第一个字符传递给移动命令?
答案1
没有使用的理由find
(除非目录数量巨大)。
dest_root='/otherdir'
for dir in [a-z]*; do
[ -d "${dir}" ] && mv "${dir}" "${dest_root}/${dir:0:1}"
done
答案2
您需要选取目录的第一个字母。通过find
循环运行输出可以很容易地做到这一点。例如,
for i in $(find . -type d -name "[a-z]*")
do
echo ${i:2:1}
done
此命令为您提供每个目录的第一个字母,忽略前导./
.要将其移至目标位置,您必须将该目录放在其他位置(当前目录之上)以避免递归移动。假设您的目标目录位于../dest/a
、../dest/b
、等等。您可以将echo
命令替换为mv
,上面的循环可以变为
destination="../dest"
for i in $(find . -type d -name "[a-z]*")
do
mv ${i} ${destination}/${i:2:1}
done
您必须根据目的地进行调整。