我有一个文件夹,其中嵌套了许多子文件夹,其中的图像名称为"IMG_7729-300x300.jpeg……IMG_7729-300x300.jpeg"。我正试图找到一种方法,使用linux删除前面的所有文本,并包括它。
我试着使用这个,但无法让它工作
find . -type f -name "*|*" -exec bash -c 'f="$1"; g="${f/*|/}"; mv -- "$f" "$g"' | '{}' ;
使用bash字符串操作和glob:
touch "IMG_7729-300x300.jpeg¦IMG_7729-300x300.jpeg"
echo "before:"
ls
for fn in *¦*; do
mv "$fn" "${fn##*¦}"
done
echo "after:"
ls
试一试如果你想使用find
,这是最好的方法:
find . -type f -name "*¦*" -execdir bash -c 'fn="{}"; mv "$fn" "${fn##*¦}"' ;
对于-execdir
主目录,find在找到文件的目录中执行命令。因此,您不需要处理基本文件名之前的限定路径。
如果您缺少POSIX shell(大多数都是),则可以使用awk
简单地完成此操作。使用awk
,您可以简单地使用'¦'
作为字段分隔符FS
和系统命令将文件移动到仅由第二个字段组成的名称,例如
$ls -1 *.jpeg | awk -F¦ '{cmd="mv "$1FS$2" "$2; system(cmd)}' -
您只需将ls -1
的输出管道化(即&;破折号one&;而不是&;破折号小写l &;)。cmd
只是一个创建字符串mv $1¦$2.jpeg $2.jpeg
的字符串连接。(其中FS
用于'¦'
)system()
命令只是将其传递给shell。如果您的名称不是以.jpeg
等结尾,则可以根据需要调整文件glob以满足您的需要。
结果是它将取一个包含:
的目录$ ls -al
total 24
drwxr-xr-x 3 david david 4096 Jan 9 21:56 .
drwxr-xr-x 6 david david 4096 Nov 18 03:45 ..
drwxr-xr-x 2 david david 4096 Jan 9 21:56 orig
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7721-300x300.jpeg¦IMG_7721-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7722-300x300.jpeg¦IMG_7722-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7723-300x300.jpeg¦IMG_7723-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7724-300x300.jpeg¦IMG_7724-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7725-300x300.jpeg¦IMG_7725-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7726-300x300.jpeg¦IMG_7726-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7727-300x300.jpeg¦IMG_7727-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7728-300x300.jpeg¦IMG_7728-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7729-300x300.jpeg¦IMG_7729-300x300.jpeg
-rw-r--r-- 1 david david 115 Oct 17 2021 f1
-rw-r--r-- 1 david david 117 Oct 17 2021 f2
-rw-r--r-- 1 david david 117 Oct 17 2021 f3
并根据需要移动文件名,从而产生内容:
$ ls -al
total 24
drwxr-xr-x 3 david david 4096 Jan 9 22:00 .
drwxr-xr-x 6 david david 4096 Nov 18 03:45 ..
drwxr-xr-x 2 david david 4096 Jan 9 21:56 orig
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7721-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7722-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7723-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7724-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7725-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7726-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7727-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7728-300x300.jpeg
-rw-r--r-- 1 david david 0 Jan 9 21:53 IMG_7729-300x300.jpeg
-rw-r--r-- 1 david david 115 Oct 17 2021 f1
-rw-r--r-- 1 david david 117 Oct 17 2021 f2
-rw-r--r-- 1 david david 117 Oct 17 2021 f3
注意:如果您有bash或shell允许从子shell重定向,您可以使用<(ls -1 *.jpeg)
消除管道,例如
awk -F¦ '{cmd="mv "$1FS$2" "$2; system(cmd)}' <(ls -1 *.jpeg)
(相同的结果)使用perl-rename
你也可以使用perl-rename
(通常符号链接到rename
-你可以检查你有rename --version
)。你会看到"perl-rename 1.11"
或"rename from util-linux 2.38.1"
)
对于perl-rename
,您可以使用一个简单的替代形式s/find/replace/
,使用扩展regex来完成文件名的第一部分的删除。在您的例子中,它将是:
$ perl-rename 's/^[^¦]+¦//' *.jpeg
查找^[^¦]+¦
:
'^'
从行首锚定[^¦]+
选择一个或多个不包含'¦'
的字符- 然后选择
'¦'
然后用(nothing)代替
将实现与上面的awk
命令相同的结果。同样的警告也适用,根据需要调整file-glob以操作所需的文件。您还可以使用-n
选项(--just-print
,--dry-run
)来查看首先要重命名的内容,而无需实际进行重命名,以确保您将实现预期的目标。