我的目录结构如下
Directory1\file1.jpg
\file2.jpg
\file3.jpg
Directory2\anotherfile1.jpg
\anotherfile2.jpg
\anotherfile3.jpg
Directory3\yetanotherfile1.jpg
\yetanotherfile2.jpg
\yetanotherfile3.jpg
我正在尝试在ubuntu上的bash shell中使用命令行从每个目录中获取第一个文件并将其重命名为目录名称并将其向上移动一级以使其位于目录旁边。
在上面的例子中:
file1.jpg
将重命名为Directory1.jpg
并放在文件夹Directory1
anotherfile1.jpg
将重命名为Directory2.jpg
并放在文件夹Directory2旁边
yetanotherfile1.jpg
将重命名为Directory3.jpg
并放在文件夹Directory3
我尝试过使用:
find . -name "*.jpg"
但它没有按顺序列出文件(我需要第一个文件)。
这一行:
find . -name "*.jpg" -type f -exec ls "{}" +;
以正确的顺序列出文件但是如何只选择每个目录中的第一个文件并将其向上移动一级?
任何帮助将不胜感激!
编辑:当我引用第一个文件时,我的意思是每个jpg从0编号到该文件夹中的多个文件 - 例如:file1,file2 ...... file34,file35等...另一个要提的是文件的格式是随机的,所以编号可能从0或1a或1b等开始......
答案 0 :(得分:23)
如果 first 表示shell glob首先找到的内容(词法,但可能受LC_COLLATE
影响),那么这应该有效:
for dir in */; do
for file in "$dir"*.jpg; do
echo mv "$file" "${file%/*}.jpg" # If it does what you want, remove the echo
break 1
done
done
概念证明:
$ mkdir dir{1,2,3} && touch dir{1,2,3}/file{1,2,3}.jpg
$ for dir in */; do for file in "$dir"*.jpg; do echo mv "$file" "${file%/*}.jpg"; break 1; done; done
mv dir1/file1.jpg dir1.jpg
mv dir2/file1.jpg dir2.jpg
mv dir3/file1.jpg dir3.jpg
答案 1 :(得分:19)
你可以进入每个目录并运行:
$ mv `ls | head -n 1` ..
答案 2 :(得分:1)
查找所有第一级目录,识别此目录中的第一个文件,然后将其向上移动一级
find . -type d \! -name . -prune | while read d; do
f=$(ls $d | head -1)
mv $d/$f .
done
答案 3 :(得分:0)
以最佳答案为基础,这是一个通用的bash函数,该函数仅返回解析为给定目录内文件的第一个路径:
getFirstFile() {
for dir in "$1"; do
for file in "$dir"*; do
if [ -f "$file" ]; then
echo "$file"
break 1
fi
done
done
}
用法:
# don't forget the trailing slash
getFirstFile ~/documents/
注意::如果您传递的路径无效,它将无提示地返回任何内容。