我有一个包含大量具有不同扩展名的文件的目录。我想要做的是将每个扩展名移动到一个名为扩展名的文件夹中,那些没有扩展名的文件移动到一个名为unkown.
例如我有文件a.txt, b.txt, a.pdf, b.pdf, a.mp4, file, newfile....
结果将是 4 个名为txt, pdf, mp4, 的目录unkonw
该txt目录包含的文件a.txt,b.txt
该pdf目录包含的文件a.pdf,b.pdf
该mp4目录包含的文件a.mp4
该unkonw目录包含的文件file,newfile
这是另一种方式:
mkdir -p unknown;
for f in *; do
[[ $f =~ \. ]] && mkdir -p "${f##*.}" &&
mv "$f" "${f##*.}"/ ||
mv "$f" unknown/; done
Run Code Online (Sandbox Code Playgroud)
&& 表示“仅当左侧的命令成功时才运行右侧的命令”。 ||表示“仅当左侧的命令失败时才运行右侧的命令”。组合的两个符号可以像if/else块一样工作。mkdir -p unknown;: 创建unknown目录。在-p有使mkdir,如果该目录存在不会抱怨。for f in * : 用于当前目录中的所有文件和目录。[[ $f =~ \. ]] &&:如果当前文件/目录名称包含.,如果它有扩展名,则...mkdir -p "${f##*.}"/:构造${var##pat}将从pat变量 的开头删除最长的匹配项$var。在这里, thepat是点的任何东西,所以这将只留下扩展名。因此,如果扩展目录不存在,此命令将创建该目录。mv "$f" "${f##*.}"/:mv然后将文件移动到相关目录中。
|| mv "$f" unknown/;: 如果上一个命令失败(如果此文件/目录)没有扩展名,请将其移至unknown.请注意,这将打印此错误消息,但您可以放心地忽略它:
mv: cannot move ‘unknown’ to a subdirectory of itself, ‘unknown/unknown’
Run Code Online (Sandbox Code Playgroud)
如果您只需要移动文件而不移动目录(上面的命令也会移动一个名为dir.foointo的目录foo/),请改用:
mkdir -p unknown;
for f in *; do
[[ -f $f ]] &&
if [[ $f =~ \. ]]; then
mkdir -p "${f##*.}" &&
mv "$f" "${f##*.}"/;
else mv "$f" unknown/; fi;
done
Run Code Online (Sandbox Code Playgroud)