Ubuntu 22.04 IPFS: Difference between revisions
Created page with "Moved from 'IPFS Basics' This page is going to be just about IPFS on/for Ubuntu 22.04 Redo from scratch, below is for notes and placeholder from old page. ==Introduction to IPFS== Note that this guide was unsuccessful on a home network but worked on a Vultr VPS. IPFS requires ports 4001 TCP and UDP to be open on the router. Tested on an Ubuntu 22.04 server. Download Linux Binary from https://dist.ipfs.tech/#go-ipfs Assuming you already have LXD set up (it doesn't ha..." |
(No difference)
|
Latest revision as of 19:13, 11 May 2023
Moved from 'IPFS Basics' This page is going to be just about IPFS on/for Ubuntu 22.04 Redo from scratch, below is for notes and placeholder from old page.
Introduction to IPFS
Note that this guide was unsuccessful on a home network but worked on a Vultr VPS. IPFS requires ports 4001 TCP and UDP to be open on the router.
Tested on an Ubuntu 22.04 server.
Download Linux Binary from https://dist.ipfs.tech/#go-ipfs
Assuming you already have LXD set up (it doesn't have to be in a container): Check https://dist.ipfs.tech/kubo/ for the latest version.
apt update && apt upgrade -y wget https://dist.ipfs.tech/kubo/v0.18.1/kubo_v0.18.1_linux-amd64.tar.gz tar xvf kubo_v0.18.1_linux-amd64.tar.gz bash kubo/install.sh ipfs init
You may encounter an error that looks like this:
ERROR provider.queue queue/queue.go:125 Failed to enqueue cid: leveldb: closed
This error does not impact the installation.
Now, create a simple text file. Replace $EDITOR with your preferred terminal text editor.
$EDITOR helloworld.txt
Add the following content to the file:
Hello there, I wonder how many devices I can see this on.
To share the file, you need to add and pin it:
ipfs add helloworld.txt
The command will return a CID, which looks like this:
QmQTnvc5eV7NdPfQ8zLVCr6gBrXaDAUKUd1SGDAfsPFnoh.
Now, pin the file:
ipfs pin add QmQTnvc5eV7NdPfQ8zLVCr6gBrXaDAUKUd1SGDAfsPFnoh
Connect to the network:
ipfs daemon
You can use CTRL+z to send the IPFS daemon to the background and run ipfs swarm peers to see connections. To bring the IPFS daemon back to the foreground, use bg to see background processes and then fg 1.
Note: ipfs.io is a third-party service and cannot handle data-heavy content. For heavy content, such as videos, download using IPFS to view.
To view the file in a web browser, simply add https://ipfs.io/ipfs/ to the beginning of the CID:
https://ipfs.io/ipfs/QmQTnvc5eV7NdPfQ8zLVCr6gBrXaDAUKUd1SGDAfsPFnoh
IPFS Desktop
https://github.com/ipfs/ipfs-desktop/releases
$HASH is placeholder for the hash of the ipfs file.
To download a file:
ipfs get $HASH
To share/host you need to pin:
ipfs pin $HASH
To view pinned items
ipfs pin ls
or
ipfs pin ls --type=recursive
add directory
ipfs add --recursive /path/to/directory
each file in directory (recursive) will be uploaded and each given a hash.
unpin
ipfs pin rm $HASH
Clear cache
ipfs repo gc
View on web browser
Note: ipfs.io is a third party service, and can not handle data heavy content. For heavy content such as videos, download using ipfs to view.
Use web site/service ipfs.io
https://ipfs.io/ipfs/$HASH
Host on Server
wget https://dist.ipfs.tech/kubo/v0.18.1/kubo_v0.18.1_linux-amd64.tar.gz
tar xvf kubo_v0.18.1_linux-amd64.tar.gz
bash kubo/install.sh
ipfs init --profile server
systemd
$EDITOR /etc/systemd/system/ipfs.service
[Unit] Description =Start ipfs daemon [Service] Type=simple ExecStart=/usr/local/bin/ipfs daemon [Install] WantedBy=multi-user.target
systemctl enable ipfs.service
systemctl start ipfs
Note: will tidy later
NOTE: should of checked the licence first,The MIT open course ware is CC BY-NC-SA 4.0 and can not be used on this website! deleteing, leaving this here for note on how to pin mass of files.
In this example i will be uploading an MIT cc-by course to ipfs.
files in a directory called mit-test-course
ipfs add --recursive /path/to/directory
will add all the files but not pin them.
root@ipfs-test:~# tree mit-test-course/ mit-test-course/ ├── 1 │ ├── 920cc911b6eb5747f2ccd431bbc4306b_lec1.py │ ├── MIT6_0001F16_Lecture_01_300k.mp4 │ └── e921a690079369751bcce3e34da6c6ee_MIT6_0001F16_Lec1.pdf ├── 10 │ ├── 066eba6ea6d56a88e56ae325940d4c4c_MIT6_0001F16_Lec10.pdf │ ├── MIT6_0001F16_Lecture_10_300k.mp4 │ └── bfa32fd241d88ae02cd3157aed232bac_lec10_complexity_part1.py ├── 11 │ ├── MIT6_0001F16_Lecture_11_300k.mp4 │ ├── bb953fb81d4afa3bc837c16eba613955_MIT6_0001F16_Lec11.pdf │ └── bdf800867e6762c6758ecd2230178f41_lec11_complexity_part2.py ├── 12 │ ├── 310536cd5f5aa1fc0c11726ce13c565e_lec12_sorting.py │ ├── 6425d0dabb1cea1a076b8c46c0ae2da6_MIT6_0001F16_Lec12.pdf │ └── MIT6_0001F16_Lecture_12_300k.mp4 ├── 2 │ ├── MIT6_0001F16_Lecture_02_300k.mp4 │ ├── ba2947b25b1580e4a84df0ec5dbe5cdd_MIT6_0001F16_Lec2.pdf │ └── d6ee838ee4c85ace93a4e170cfd83c03_lec2_branch_loops.py ├── 3 │ ├── 88de925a1fb925e46a08bc5f34d029bd_lec3_strings_algos.py │ ├── MIT6_0001F16_Lecture_03_300k.mp4 │ └── b9b9a82a29e8746db1facfbd30c07940_MIT6_0001F16_Lec3.pdf ├── 4 │ ├── 6ba59859535f1566dd57a7279aeba5d1_MIT6_0001F16_Lec4.pdf │ ├── 9e8439a27af18817e046ac37333d03f6_lec4_functions.py │ └── MIT6_0001F16_Lecture_04_300k.mp4 ├── 5 │ ├── 1776670e271578eeb99fc25975f20586_MIT6_0001F16_Lec5.pdf │ ├── MIT6_0001F16_Lecture_05_300k.mp4 │ └── cdf5f8e7f109952655f4d253ed955555_lec5_tuples_lists.py ├── 6 │ ├── 706228e592761d9c7c1c073f8ba7a6cc_lec6_recursion_dictionaries.py │ ├── 876348c652c5353daccc96e1b7d577bb_MIT6_0001F16_Lec6.pdf │ └── MIT6_0001F16_Lecture_06_300k.mp4 ├── 7 │ ├── 51bdde43dfd773ba20747ce5d89119ac_MIT6_0001F16_Lec7.pdf │ ├── MIT6_0001F16_Lecture_07_300k.mp4 │ └── abdd1d61892ccce9be2ad84e52004e07_lec7_debug_except.py ├── 8 │ ├── 0705ac9dcc7e637a0e8e9d97eb258a26_lec8_classes.py │ ├── 7a6f85d03f132dcd9d7592bc4643be1c_MIT6_0001F16_Lec8.pdf │ └── MIT6_0001F16_Lecture_08_300k.mp4 ├── 9 │ ├── 2dd6c75e7b4bd6bd135078e6f3701201_MIT6_0001F16_Lec9.pdf │ ├── MIT6_0001F16_Lecture_09_300k.mp4 │ └── bf8e8195044d5f6aefc1a455968e2f3e_lec9_inheritance.py └── Introduction to Computer Science and Programming in Python.txt 12 directories, 37 files
ipfs add --recursive /path/to/mit-test-course > mit.txt
will upload and create a file called mit.txt with the following output:
root@ipfs-test:~# cat mit.txt added QmengUgSy9oY9qMXJC6ujKy7mMpunb5sG5Uo8RpFX4G5g9 mit-test-course/1/920cc911b6eb5747f2ccd431bbc4306b_lec1.py added QmaTdTMxWdz6ySLbx258zQU5McpJTo4ZEVJ63GSKmVEyeM mit-test-course/1/MIT6_0001F16_Lecture_01_300k.mp4 added QmemB25bVuN2fuiAq3JaDM4J5MYit6HfCCsU3EFTWL7wpF mit-test-course/1/e921a690079369751bcce3e34da6c6ee_MIT6_0001F16_Lec1.pdf added QmbyP59ttPKGe5ZNADsgqTsgBF3oYGzhZXFfBhszG2nuPm mit-test-course/10/066eba6ea6d56a88e56ae325940d4c4c_MIT6_0001F16_Lec10.pdf added QmQNooq1g25LFp1Fxj2tfpKKMKi8NbutkhuXNf5Ppo7t5f mit-test-course/10/MIT6_0001F16_Lecture_10_300k.mp4 added QmUtgXQXjj2C3qb2UXFrPmKHkFdEjmehk4ZLQhcZ37rEmw mit-test-course/10/bfa32fd241d88ae02cd3157aed232bac_lec10_complexity_part1.py added QmR7Ned6iZytjpVHVN6W53EZ5Qg4Zd6EkEcXxn8DjYMgrd mit-test-course/11/MIT6_0001F16_Lecture_11_300k.mp4 added QmNPjN3616QdmEWLPokwuTkLL1vrzcLVRSFLWUcukqtxZL mit-test-course/11/bb953fb81d4afa3bc837c16eba613955_MIT6_0001F16_Lec11.pdf added QmdpwFTFkwnkqWW3CozBBAfeYHchDeVAV7ArkA1dUqbUZ4 mit-test-course/11/bdf800867e6762c6758ecd2230178f41_lec11_complexity_part2.py added QmbV8ct8DEQyRGRDSX4PaQBXk8r8ryYLDNwTa2buC7kcP5 mit-test-course/12/310536cd5f5aa1fc0c11726ce13c565e_lec12_sorting.py added QmToP68Knz71euVuntRWtz6UshRoiRssELJNFMeP1f2sR5 mit-test-course/12/6425d0dabb1cea1a076b8c46c0ae2da6_MIT6_0001F16_Lec12.pdf added QmPWidAv5mBrgEcKDVqWe62JaAiwBWs8KZc1S8r3bbJsvY mit-test-course/12/MIT6_0001F16_Lecture_12_300k.mp4 added QmTFdkMJnzUcwgs1hdoF7qtADE2NqTJVaF9CfgULbzSuA9 mit-test-course/2/MIT6_0001F16_Lecture_02_300k.mp4 added QmNiZvEh6UmpHLTxw4saN7WdojzBokp2JCbucYzrekoQBK mit-test-course/2/ba2947b25b1580e4a84df0ec5dbe5cdd_MIT6_0001F16_Lec2.pdf added QmPjEzEu56mqeE19Vth9AkDbAxz7wAWg9zMVvF9FZ1UBvK mit-test-course/2/d6ee838ee4c85ace93a4e170cfd83c03_lec2_branch_loops.py added QmYppDgGMptihHA7ixFw2GHvspN8Bw1HY21HtUpQNxi23i mit-test-course/3/88de925a1fb925e46a08bc5f34d029bd_lec3_strings_algos.py added QmTTCsuhbnjXWuigZLSgKAt4DjFsm78MANo3KUMGcK98s1 mit-test-course/3/MIT6_0001F16_Lecture_03_300k.mp4 added QmP2AZfUx8RTqCGamJtPyodFU8dHG8QrBHYKkP79YepEe9 mit-test-course/3/b9b9a82a29e8746db1facfbd30c07940_MIT6_0001F16_Lec3.pdf added QmP1p4h21ogMxWeeX2PiDibQbHqWer7ABCsMrfMxEx7QBW mit-test-course/4/6ba59859535f1566dd57a7279aeba5d1_MIT6_0001F16_Lec4.pdf added QmNtPQncXMYNBnX4NoNfx2ifetrfvrATamdrsjx4u9iQ7c mit-test-course/4/9e8439a27af18817e046ac37333d03f6_lec4_functions.py added QmQuc5zpaJdMfRYxTLyZc5DQuota1FjuJiqgWf8ctGmRsU mit-test-course/4/MIT6_0001F16_Lecture_04_300k.mp4 added QmSdxg2inPbK1FSynNdPUka6CUZtEGG6sdPZgxaAgb46GE mit-test-course/5/1776670e271578eeb99fc25975f20586_MIT6_0001F16_Lec5.pdf added Qmco5sKKQfnWUNP9ZUxLkDhoV6jfjv8L4AdzES7En41AzP mit-test-course/5/MIT6_0001F16_Lecture_05_300k.mp4 added QmThDori5ETa3U27DFpndU7RmsLgG7zjpqGVxAncCupSuc mit-test-course/5/cdf5f8e7f109952655f4d253ed955555_lec5_tuples_lists.py added QmaGhNYnR5yUMYZf4q7qLsNwEW6B7pbLbgJokJBTNSA2FT mit-test-course/6/706228e592761d9c7c1c073f8ba7a6cc_lec6_recursion_dictionaries.py added QmQAqSGJAeoypUMyUnb7hRrziDyRAwymcTGdcaydT5i73s mit-test-course/6/876348c652c5353daccc96e1b7d577bb_MIT6_0001F16_Lec6.pdf added QmVzK3PVETv69Y27UKDfaQQM5um8ByMdYQS3TzD2EkoR42 mit-test-course/6/MIT6_0001F16_Lecture_06_300k.mp4 added QmcqZoeVrsfBv4Ri6M8KtiLdy3VpKnyznDFhX8zvfd3Qrs mit-test-course/7/51bdde43dfd773ba20747ce5d89119ac_MIT6_0001F16_Lec7.pdf added QmUyiqpAUA91w4Xm2Dz2wPr6kE6wTzA1apwJziTdBysRLw mit-test-course/7/MIT6_0001F16_Lecture_07_300k.mp4 added QmeVKCB6ponYr4f72MuNwegukX9t42NTywNHpDPgyNi9ae mit-test-course/7/abdd1d61892ccce9be2ad84e52004e07_lec7_debug_except.py added QmQCaZZA75UQ5pAKy8zhcz6Ci8yY13UVHUvsuXmid86GUH mit-test-course/8/0705ac9dcc7e637a0e8e9d97eb258a26_lec8_classes.py added QmdccChFuYBCiLmufEmk6oXCHybaUQiPXajD3c3xMupiaC mit-test-course/8/7a6f85d03f132dcd9d7592bc4643be1c_MIT6_0001F16_Lec8.pdf added QmZFSSPndvRfPT2vyehuyEQitfb8CzdYkA7orFAKyvhA4u mit-test-course/8/MIT6_0001F16_Lecture_08_300k.mp4 added QmbaJFk4mFRmCbtQybK94etyfRA2LcM22Kfvjbvdf6X8Gw mit-test-course/9/2dd6c75e7b4bd6bd135078e6f3701201_MIT6_0001F16_Lec9.pdf added QmdENonCipE7TK99i7dFz9paqDUSefR4PFdveEmVi5oXAb mit-test-course/9/MIT6_0001F16_Lecture_09_300k.mp4 added QmQ7UB4PaGBRHvHfDshrASwynvansFVXrp3RNULwhThUsC mit-test-course/9/bf8e8195044d5f6aefc1a455968e2f3e_lec9_inheritance.py added Qmdw2XaaX99t7eNzRNXdHEHYzwiH5qhg1iBLDpekCXj5am mit-test-course/Introduction to Computer Science and Programming in Python.txt added QmQM6QEJK9kJGzxe1ntDKrE7nLtB9CPqupjQZvsEze6rkK mit-test-course/1 added QmX7ZEHg2WipkSbwani5iSwxtBPgghajtGP1QqJQ6jQAAE mit-test-course/10 added QmaUyBU3M5zFpeHrMdZbapSLf73SUHZaookrCRCRm87Jwb mit-test-course/11 added QmP3Xx9cUp9Ly44bP1TXQHziVpLpNuZDnH7nRhdQTJPk5w mit-test-course/12 added QmYQQLN4pEdKi7S8GJJLFtw4LCEiZPkUzRjyNJqNcrU7kS mit-test-course/2 added QmZvUavbLwZ5PjiadoGSvB8nURGaeDiTyNivZq9tsPN1dD mit-test-course/3 added QmWf7uJtJmBhLB4sAsWUDWGwPyz24yboHYqxZGpEAwP4Gx mit-test-course/4 added QmPAApNSDbgZnr1tVe77zPx8bz3USsP4UZxA6nCCSMEbRx mit-test-course/5 added QmPMEUkViQsT7XwfPxwque3EfmPs1kaVJCU5Bc8AujYfej mit-test-course/6 added QmWnzp23vzhx8rX5z7W9WZVWGq2H8j18GmqddbHRa79jX1 mit-test-course/7 added QmRnosvcFPgEZSGMyRw9uuTyDzcQf6Q2ffEXADYEFvqtsN mit-test-course/8 added QmeUE3L3gwNvK3BvcutttWxSJPn7RusxNZHzTQeYUNGzjw mit-test-course/9 added QmY965P9FuqBum5Ppy7QWUf1HBRVdqDbMFVDStBdjNnjqk mit-test-course
Now we are going to use awk to just print out the hashes.
cat mit.txt | awk '{print $2}' >hash.txt
cat hash.txt
will return:
root@ipfs-test:~# cat hash.txt QmengUgSy9oY9qMXJC6ujKy7mMpunb5sG5Uo8RpFX4G5g9 QmaTdTMxWdz6ySLbx258zQU5McpJTo4ZEVJ63GSKmVEyeM QmemB25bVuN2fuiAq3JaDM4J5MYit6HfCCsU3EFTWL7wpF QmbyP59ttPKGe5ZNADsgqTsgBF3oYGzhZXFfBhszG2nuPm QmQNooq1g25LFp1Fxj2tfpKKMKi8NbutkhuXNf5Ppo7t5f QmUtgXQXjj2C3qb2UXFrPmKHkFdEjmehk4ZLQhcZ37rEmw QmR7Ned6iZytjpVHVN6W53EZ5Qg4Zd6EkEcXxn8DjYMgrd QmNPjN3616QdmEWLPokwuTkLL1vrzcLVRSFLWUcukqtxZL QmdpwFTFkwnkqWW3CozBBAfeYHchDeVAV7ArkA1dUqbUZ4 QmbV8ct8DEQyRGRDSX4PaQBXk8r8ryYLDNwTa2buC7kcP5 QmToP68Knz71euVuntRWtz6UshRoiRssELJNFMeP1f2sR5 QmPWidAv5mBrgEcKDVqWe62JaAiwBWs8KZc1S8r3bbJsvY QmTFdkMJnzUcwgs1hdoF7qtADE2NqTJVaF9CfgULbzSuA9 QmNiZvEh6UmpHLTxw4saN7WdojzBokp2JCbucYzrekoQBK QmPjEzEu56mqeE19Vth9AkDbAxz7wAWg9zMVvF9FZ1UBvK QmYppDgGMptihHA7ixFw2GHvspN8Bw1HY21HtUpQNxi23i QmTTCsuhbnjXWuigZLSgKAt4DjFsm78MANo3KUMGcK98s1 QmP2AZfUx8RTqCGamJtPyodFU8dHG8QrBHYKkP79YepEe9 QmP1p4h21ogMxWeeX2PiDibQbHqWer7ABCsMrfMxEx7QBW QmNtPQncXMYNBnX4NoNfx2ifetrfvrATamdrsjx4u9iQ7c QmQuc5zpaJdMfRYxTLyZc5DQuota1FjuJiqgWf8ctGmRsU QmSdxg2inPbK1FSynNdPUka6CUZtEGG6sdPZgxaAgb46GE Qmco5sKKQfnWUNP9ZUxLkDhoV6jfjv8L4AdzES7En41AzP QmThDori5ETa3U27DFpndU7RmsLgG7zjpqGVxAncCupSuc QmaGhNYnR5yUMYZf4q7qLsNwEW6B7pbLbgJokJBTNSA2FT QmQAqSGJAeoypUMyUnb7hRrziDyRAwymcTGdcaydT5i73s QmVzK3PVETv69Y27UKDfaQQM5um8ByMdYQS3TzD2EkoR42 QmcqZoeVrsfBv4Ri6M8KtiLdy3VpKnyznDFhX8zvfd3Qrs QmUyiqpAUA91w4Xm2Dz2wPr6kE6wTzA1apwJziTdBysRLw QmeVKCB6ponYr4f72MuNwegukX9t42NTywNHpDPgyNi9ae QmQCaZZA75UQ5pAKy8zhcz6Ci8yY13UVHUvsuXmid86GUH QmdccChFuYBCiLmufEmk6oXCHybaUQiPXajD3c3xMupiaC QmZFSSPndvRfPT2vyehuyEQitfb8CzdYkA7orFAKyvhA4u QmbaJFk4mFRmCbtQybK94etyfRA2LcM22Kfvjbvdf6X8Gw QmdENonCipE7TK99i7dFz9paqDUSefR4PFdveEmVi5oXAb QmQ7UB4PaGBRHvHfDshrASwynvansFVXrp3RNULwhThUsC Qmdw2XaaX99t7eNzRNXdHEHYzwiH5qhg1iBLDpekCXj5am QmQM6QEJK9kJGzxe1ntDKrE7nLtB9CPqupjQZvsEze6rkK QmX7ZEHg2WipkSbwani5iSwxtBPgghajtGP1QqJQ6jQAAE QmaUyBU3M5zFpeHrMdZbapSLf73SUHZaookrCRCRm87Jwb QmP3Xx9cUp9Ly44bP1TXQHziVpLpNuZDnH7nRhdQTJPk5w QmYQQLN4pEdKi7S8GJJLFtw4LCEiZPkUzRjyNJqNcrU7kS QmZvUavbLwZ5PjiadoGSvB8nURGaeDiTyNivZq9tsPN1dD QmWf7uJtJmBhLB4sAsWUDWGwPyz24yboHYqxZGpEAwP4Gx QmPAApNSDbgZnr1tVe77zPx8bz3USsP4UZxA6nCCSMEbRx QmPMEUkViQsT7XwfPxwque3EfmPs1kaVJCU5Bc8AujYfej QmWnzp23vzhx8rX5z7W9WZVWGq2H8j18GmqddbHRa79jX1 QmRnosvcFPgEZSGMyRw9uuTyDzcQf6Q2ffEXADYEFvqtsN QmeUE3L3gwNvK3BvcutttWxSJPn7RusxNZHzTQeYUNGzjw QmY965P9FuqBum5Ppy7QWUf1HBRVdqDbMFVDStBdjNnjqk
Can do in terminal but will make bash script.
$EDITOR pin-hash.sh
#!/bin/bash while read p; do ipfs pin add $p done <hash.txt
bash pin-hash.sh
root@ipfs-test:~# bash pin-hash.sh pinned QmengUgSy9oY9qMXJC6ujKy7mMpunb5sG5Uo8RpFX4G5g9 recursively pinned QmaTdTMxWdz6ySLbx258zQU5McpJTo4ZEVJ63GSKmVEyeM recursively pinned QmemB25bVuN2fuiAq3JaDM4J5MYit6HfCCsU3EFTWL7wpF recursively pinned QmbyP59ttPKGe5ZNADsgqTsgBF3oYGzhZXFfBhszG2nuPm recursively pinned QmQNooq1g25LFp1Fxj2tfpKKMKi8NbutkhuXNf5Ppo7t5f recursively pinned QmUtgXQXjj2C3qb2UXFrPmKHkFdEjmehk4ZLQhcZ37rEmw recursively pinned QmR7Ned6iZytjpVHVN6W53EZ5Qg4Zd6EkEcXxn8DjYMgrd recursively pinned QmNPjN3616QdmEWLPokwuTkLL1vrzcLVRSFLWUcukqtxZL recursively pinned QmdpwFTFkwnkqWW3CozBBAfeYHchDeVAV7ArkA1dUqbUZ4 recursively pinned QmbV8ct8DEQyRGRDSX4PaQBXk8r8ryYLDNwTa2buC7kcP5 recursively pinned QmToP68Knz71euVuntRWtz6UshRoiRssELJNFMeP1f2sR5 recursively pinned QmPWidAv5mBrgEcKDVqWe62JaAiwBWs8KZc1S8r3bbJsvY recursively pinned QmTFdkMJnzUcwgs1hdoF7qtADE2NqTJVaF9CfgULbzSuA9 recursively pinned QmNiZvEh6UmpHLTxw4saN7WdojzBokp2JCbucYzrekoQBK recursively pinned QmPjEzEu56mqeE19Vth9AkDbAxz7wAWg9zMVvF9FZ1UBvK recursively pinned QmYppDgGMptihHA7ixFw2GHvspN8Bw1HY21HtUpQNxi23i recursively pinned QmTTCsuhbnjXWuigZLSgKAt4DjFsm78MANo3KUMGcK98s1 recursively pinned QmP2AZfUx8RTqCGamJtPyodFU8dHG8QrBHYKkP79YepEe9 recursively pinned QmP1p4h21ogMxWeeX2PiDibQbHqWer7ABCsMrfMxEx7QBW recursively pinned QmNtPQncXMYNBnX4NoNfx2ifetrfvrATamdrsjx4u9iQ7c recursively pinned QmQuc5zpaJdMfRYxTLyZc5DQuota1FjuJiqgWf8ctGmRsU recursively pinned QmSdxg2inPbK1FSynNdPUka6CUZtEGG6sdPZgxaAgb46GE recursively pinned Qmco5sKKQfnWUNP9ZUxLkDhoV6jfjv8L4AdzES7En41AzP recursively pinned QmThDori5ETa3U27DFpndU7RmsLgG7zjpqGVxAncCupSuc recursively pinned QmaGhNYnR5yUMYZf4q7qLsNwEW6B7pbLbgJokJBTNSA2FT recursively pinned QmQAqSGJAeoypUMyUnb7hRrziDyRAwymcTGdcaydT5i73s recursively pinned QmVzK3PVETv69Y27UKDfaQQM5um8ByMdYQS3TzD2EkoR42 recursively pinned QmcqZoeVrsfBv4Ri6M8KtiLdy3VpKnyznDFhX8zvfd3Qrs recursively pinned QmUyiqpAUA91w4Xm2Dz2wPr6kE6wTzA1apwJziTdBysRLw recursively pinned QmeVKCB6ponYr4f72MuNwegukX9t42NTywNHpDPgyNi9ae recursively pinned QmQCaZZA75UQ5pAKy8zhcz6Ci8yY13UVHUvsuXmid86GUH recursively pinned QmdccChFuYBCiLmufEmk6oXCHybaUQiPXajD3c3xMupiaC recursively pinned QmZFSSPndvRfPT2vyehuyEQitfb8CzdYkA7orFAKyvhA4u recursively pinned QmbaJFk4mFRmCbtQybK94etyfRA2LcM22Kfvjbvdf6X8Gw recursively pinned QmdENonCipE7TK99i7dFz9paqDUSefR4PFdveEmVi5oXAb recursively pinned QmQ7UB4PaGBRHvHfDshrASwynvansFVXrp3RNULwhThUsC recursively pinned Qmdw2XaaX99t7eNzRNXdHEHYzwiH5qhg1iBLDpekCXj5am recursively pinned QmQM6QEJK9kJGzxe1ntDKrE7nLtB9CPqupjQZvsEze6rkK recursively pinned QmX7ZEHg2WipkSbwani5iSwxtBPgghajtGP1QqJQ6jQAAE recursively pinned QmaUyBU3M5zFpeHrMdZbapSLf73SUHZaookrCRCRm87Jwb recursively pinned QmP3Xx9cUp9Ly44bP1TXQHziVpLpNuZDnH7nRhdQTJPk5w recursively pinned QmYQQLN4pEdKi7S8GJJLFtw4LCEiZPkUzRjyNJqNcrU7kS recursively pinned QmZvUavbLwZ5PjiadoGSvB8nURGaeDiTyNivZq9tsPN1dD recursively pinned QmWf7uJtJmBhLB4sAsWUDWGwPyz24yboHYqxZGpEAwP4Gx recursively pinned QmPAApNSDbgZnr1tVe77zPx8bz3USsP4UZxA6nCCSMEbRx recursively pinned QmPMEUkViQsT7XwfPxwque3EfmPs1kaVJCU5Bc8AujYfej recursively pinned QmWnzp23vzhx8rX5z7W9WZVWGq2H8j18GmqddbHRa79jX1 recursively pinned QmRnosvcFPgEZSGMyRw9uuTyDzcQf6Q2ffEXADYEFvqtsN recursively pinned QmeUE3L3gwNvK3BvcutttWxSJPn7RusxNZHzTQeYUNGzjw recursively pinned QmY965P9FuqBum5Ppy7QWUf1HBRVdqDbMFVDStBdjNnjqk recursively
bash script to pin recursive directory to IPFS
to use script.sh /path/to/directory
#!/bin/bash
# Check if directory argument is provided
if [ -z "$1" ]; then
echo "Usage: script.sh /path/to/directory"
exit 1
fi
# Check if IPFS is installed
if ! command -v ipfs &> /dev/null; then
echo "IPFS is not installed. Please install it first."
exit 1
fi
# Set directory path and filenames
dir_path="$1"
ipfs_list="/tmp/ipfs_$(date +'%Y%m%d%H%M%S').list"
ipfs_hash="/tmp/ipfs_$(date +'%Y%m%d%H%M%S').hash"
# Add directory to IPFS and save output to temporary file
ipfs add --recursive "$dir_path" > "$ipfs_list"
# Extract IPFS hashes from list and save to temporary file
cat "$ipfs_list" | awk '{print $2}' > "$ipfs_hash"
# Pin each hash from temporary file
while read -r hash; do
ipfs pin add "$hash"
done < "$ipfs_hash"
# Clean up temporary files
rm "$ipfs_list" "$ipfs_hash"
Here's how the script works:
- It first checks if a directory path argument is provided. If not, it prints the usage instructions and exits.
- It checks if IPFS is installed by checking if the ipfs command is available. If not, it prints an error message and exits.
- It sets the directory path and temporary filenames for the IPFS list and hash.
- It adds the specified directory to IPFS recursively using the ipfs add command and saves the output to the temporary IPFS list file.
- It extracts the IPFS hashes from the list file and saves them to the temporary IPFS hash file.
- It loops through each hash in the temporary hash file and pins it using the ipfs pin add command.
- Finally, it cleans up the temporary files.
Note that this script will create new temporary files with a timestamp appended to the filename each time it is run. This is to avoid overwriting any existing temporary files with the same name.