假设我正在组织一个目录。它看起来像这样:
.
├── file_a.adoc
├── file_a.c
├── file_a.py
├── file_b.adoc
├── file_b.c
├── file_b.py
├── file_c.adoc
├── file_c.c
└── file_c.py
现在我在这一点上:
.
├── a
│ ├── file_a.adoc
│ ├── file_a.c
│ └── file_a.py
├── b
│ ├── file_b.adoc
│ ├── file_b.c
│ └── file_b.py
├── c
├── file_c.adoc
├── file_c.c
└── file_c.py
我想要一个可以将所有剩余的非目录文件移动到 dir c 中的命令。
在这个例子中我可以使用
mv *_c* c
但在更现实的情况下,您可能没有一个好的模式可以抓住,或者可能不关心确定一个模式。
答案1
一种方法是“将文件中的所有内容移至 c 中”的直译:
for f in *; do if [ -f "$f" ]; then mv "$f" c; fi; done
或者避免 if-then 的冗长:
for f in *; do [ -f "$f" ] && mv "$f" c; done
更好,不会在set -e
shell 中失败:
for f in *; do [ -f "$f" ] && mv "$f" c || true; done
我的偏好是,当且仅当其中一项操作失败时才会失败:
for f in *; do [ ! -f "$f" ] || mv "$f" c; done
从字面上看:对于每个 f,要么它不是一个文件,要么它被移动到 c,要么我们中止。
答案2
使用zsh
外壳:
mv -- *(.) c
这扩展了*
通配模式,但通配限定符(.)
将其过滤为仅包含常规文件的名称。然后将它们交给mv
命令并全部移动到c
目录中。
来自非zsh
shell:
zsh -c 'mv -- *(.) c'
您可以使用字面意思是“非目录”的名称,而不是使用通配符(.)
来仅选择常规文件的名称。(^/)
不同之处在于,它还*(^/)
可以匹配符号链接和其他非目录文件类型的名称。
答案3
for i in a b c; do
mkdir "$i" # use -p if you need it
find . -type f -name "*_$i.*" -exec mv -t "$i" {} + # or, mv {} "$i" \;
done